pax_global_header00006660000000000000000000000064146525166650014532gustar00rootroot0000000000000052 comment=2c04236faaacd021b7810289cbac93e962ff14da sprockets-rails-3.5.2/000077500000000000000000000000001465251666500146665ustar00rootroot00000000000000sprockets-rails-3.5.2/.devcontainer/000077500000000000000000000000001465251666500174255ustar00rootroot00000000000000sprockets-rails-3.5.2/.devcontainer/devcontainer.json000066400000000000000000000016731465251666500230100ustar00rootroot00000000000000// For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/ruby { "name": "sprockets-rails", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "ghcr.io/rails/devcontainer/images/ruby:3.2.5", // Features to add to the dev container. More info: https://containers.dev/features. "features": { "ghcr.io/devcontainers/features/github-cli:1": { "version": "latest" } } // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. // "postCreateCommand": "ruby --version", // Configure tool-specific properties. // "customizations": {}, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root" } sprockets-rails-3.5.2/.github/000077500000000000000000000000001465251666500162265ustar00rootroot00000000000000sprockets-rails-3.5.2/.github/workflows/000077500000000000000000000000001465251666500202635ustar00rootroot00000000000000sprockets-rails-3.5.2/.github/workflows/ci.yml000066400000000000000000000025531465251666500214060ustar00rootroot00000000000000name: CI on: [push, pull_request] jobs: tests: runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - ruby: 2.5 gemfile: "gemfiles/Gemfile.rails-6.1-sprockets-3" - ruby: 2.5 gemfile: "gemfiles/Gemfile.rails-6.1-sprockets-4" - ruby: 2.7 gemfile: "gemfiles/Gemfile.rails-7.0-sprockets-3" - ruby: 2.7 gemfile: "gemfiles/Gemfile.rails-7.0-sprockets-4" - ruby: 2.7 gemfile: "gemfiles/Gemfile.rails-7.1-sprockets-3" - ruby: 2.7 gemfile: "gemfiles/Gemfile.rails-7.1-sprockets-4" - ruby: 3.1 gemfile: "gemfiles/Gemfile.rails-7.2-sprockets-3" - ruby: 3.1 gemfile: "gemfiles/Gemfile.rails-7.2-sprockets-4" - ruby: 3.1 gemfile: Gemfile - ruby: 3.2 gemfile: Gemfile - ruby: 3.3 gemfile: Gemfile - ruby: head gemfile: Gemfile env: BUNDLE_GEMFILE: ${{ matrix.gemfile }} steps: - uses: actions/checkout@v3 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - name: Run tests run: bundle exec rake continue-on-error: ${{ matrix.gemfile == 'Gemfile' }} sprockets-rails-3.5.2/.gitignore000066400000000000000000000000311465251666500166500ustar00rootroot00000000000000Gemfile*.lock tmp/ *.gem sprockets-rails-3.5.2/CONTRIBUTING.md000066400000000000000000000052631465251666500171250ustar00rootroot00000000000000Contributing to Sprockets Rails ===================== Sprockets Rails is work of [many contributors](https://github.com/rails/sprockets-rails/graphs/contributors). You're encouraged to submit [pull requests](https://github.com/rails/sprockets-rails/pulls), [propose features and discuss issues](https://github.com/rails/sprockets-rails/issues). #### Fork the Project Fork the [project on GitHub](https://github.com/rails/sprockets-rails) and clone your fork. Use your GitHub username instead of `YOUR-USERNAME`. ``` git clone https://github.com/YOUR-USERNAME/sprockets-rails.git cd sprockets-rails git remote add upstream https://github.com/rails/sprockets-rails.git ``` #### Create a Topic Branch Make sure your fork is up-to-date and create a topic branch for your feature or bug fix. ``` git checkout master git pull upstream master git checkout -b my-feature-branch ``` #### Bundle Install and Test Ensure that you can build the project and run tests. ``` bundle install bundle exec rake test ``` #### Write Tests Try to write a test that reproduces the problem you're trying to fix or describes a feature that you want to build. Add to [test](test). We definitely appreciate pull requests that highlight or reproduce a problem, even without a fix. #### Write Code Implement your feature or bug fix. Make sure that `bundle exec rake test` completes without errors. #### Write Documentation Document any external behavior in the [README](README.md). #### Commit Changes Make sure git knows your name and email address: ``` git config --global user.name "Your Name" git config --global user.email "contributor@example.com" ``` Writing good commit logs is important. A commit log should describe what changed and why. ``` git add ... git commit ``` #### Push ``` git push origin my-feature-branch ``` #### Make a Pull Request Go to https://github.com/contributor/sprockets-rails and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days. #### Rebase If you've been working on a change for a while, rebase with upstream/master. ``` git fetch upstream git rebase upstream/master git push origin my-feature-branch -f ``` #### Check on Your Pull Request Go back to your pull request after a few minutes and see whether it passed muster with Travis-CI. Everything should look green, otherwise fix issues and amend your commit as described above. #### Be Patient It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there! #### Thank You Please do know that we really appreciate and value your time and work. We love you, really. sprockets-rails-3.5.2/Gemfile000066400000000000000000000003441465251666500161620ustar00rootroot00000000000000source 'https://rubygems.org' gemspec gem 'actionpack', github: 'rails/rails', branch: 'main' gem 'railties', github: 'rails/rails', branch: 'main' gem 'rack', '~> 2.2' gem 'sprockets', github: 'rails/sprockets', branch: '3.x' sprockets-rails-3.5.2/MIT-LICENSE000066400000000000000000000020441465251666500163220ustar00rootroot00000000000000Copyright (c) 2014-2016 Joshua Peek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sprockets-rails-3.5.2/README.md000066400000000000000000000210301465251666500161410ustar00rootroot00000000000000# Sprockets Rails Provides [Sprockets](https://github.com/rails/sprockets) implementation for Rails 4.x (and beyond) Asset Pipeline. ## Installation ``` ruby gem 'sprockets-rails', :require => 'sprockets/railtie' ``` Or alternatively `require 'sprockets/railtie'` in your `config/application.rb` if you have Bundler auto-require disabled. ## Usage ### Rake task **`rake assets:precompile`** Deployment task that compiles any assets listed in `config.assets.precompile` to `public/assets`. **`rake assets:clean`** Only removes old assets (keeps the most recent 3 copies) from `public/assets`. Useful when doing rolling deploys that may still be serving old assets while the new ones are being compiled. **`rake assets:clobber`** Nuke `public/assets`. #### Customize If the basic tasks don't do all that you need, it's straight forward to redefine them and replace them with something more specific to your app. You can also redefine the task with the built in task generator. ``` ruby require 'sprockets/rails/task' Sprockets::Rails::Task.new(Rails.application) do |t| t.environment = lambda { Rails.application.assets } t.assets = %w( application.js application.css ) t.keep = 5 end ``` Each asset task will invoke `assets:environment` first. By default this loads the Rails environment. You can override this task to add or remove dependencies for your specific compilation environment. Also see [Sprockets::Rails::Task](https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/rails/task.rb) and [Rake::SprocketsTask](https://github.com/rails/sprockets/blob/master/lib/rake/sprocketstask.rb). ### Initializer options **`config.assets.unknown_asset_fallback`** When set to a truthy value, a result will be returned even if the requested asset is not found in the asset pipeline. When set to a falsey value it will raise an error when no asset is found in the pipeline. Defaults to `true`. **`config.assets.precompile`** Add additional assets to compile on deploy. Defaults to `application.js`, `application.css` and any other non-js/css file under `app/assets`. **`config.assets.paths`** Add additional load paths to this Array. Rails includes `app/assets`, `lib/assets` and `vendor/assets` for you already. Plugins might want to add their custom paths to this. **`config.assets.quiet`** Suppresses logger output for asset requests. Uses the `config.assets.prefix` path to match asset requests. Defaults to `false`. **`config.assets.version`** Set a custom cache buster string. Changing it will cause all assets to recompile on the next build. ``` ruby config.assets.version = 'v1' # after installing a new plugin, change loads paths config.assets.version = 'v2' ``` **`config.assets.prefix`** Defaults to `/assets`. Changes the directory to compile assets to. **`config.assets.digest`** When enabled, fingerprints will be added to asset filenames. **`config.assets.debug`** Enable asset debugging mode. A source map will be included with each asset when this is true. **`config.assets.compile`** Enables Sprockets compile environment. If disabled, `Rails.application.assets` will be `nil` to prevent inadvertent compilation calls. View helpers will depend on assets being precompiled to `public/assets` in order to link to them. Initializers expecting `Rails.application.assets` during boot should be accessing the environment in a `config.assets.configure` block. See below. **`config.assets.configure`** Invokes block with environment when the environment is initialized. Allows direct access to the environment instance and lets you lazily load libraries only needed for asset compiling. ``` ruby config.assets.configure do |env| env.js_compressor = :uglifier # or :closure, :yui env.css_compressor = :sass # or :yui require 'my_processor' env.register_preprocessor 'application/javascript', MyProcessor env.logger = Rails.logger end ``` **`config.assets.resolve_assets_in_css_urls`** When this option is enabled, sprockets-rails will register a CSS postprocessor to resolve assets referenced in [`url()`](https://developer.mozilla.org/en-US/docs/Web/CSS/url()) function calls and replace them with the digested paths. Defaults to `true`. **`config.assets.resolve_with`** A list of `:environment` and `:manifest` symbols that defines the order that we try to find assets: manifest first, environment second? Manifest only? By default, we check the manifest first if asset digests are enabled and debug is not enabled, then we check the environment if compiling is enabled: ``` # Dev where debug is true, or digests are disabled %i[ environment ] # Dev default, or production with compile enabled. %i[ manifest environment ] # Production default. %i[ manifest ] ``` If the resolver list is empty (e.g. if debug is true and compile is false), the standard rails public path resolution will be used. **`config.assets.check_precompiled_asset`** When enabled, an exception is raised for missing assets. This option is enabled by default. ## Complementary plugins The following plugins provide some extras for the Sprockets Asset Pipeline. * [coffee-rails](https://github.com/rails/coffee-rails) * [sass-rails](https://github.com/rails/sass-rails) **NOTE** That these plugins are optional. The core coffee-script, sass, less, uglify, (and many more) features are built into Sprockets itself. Many of these plugins only provide generators and extra helpers. You can probably get by without them. ## Changes from Rails 3.x * Only compiles digest filenames. Static non-digest assets should simply live in public/. * Unmanaged asset paths and urls fallback to linking to public/. This should make it easier to work with both compiled assets and simple static assets. As a side effect, there will never be any "asset not precompiled errors" when linking to missing assets. They will just link to a public file which may or may not exist. * JS and CSS compressors must be explicitly set. Magic detection has been removed to avoid loading compressors in environments where you want to avoid loading any of the asset libraries. Assign `config.assets.js_compressor = :uglifier` or `config.assets.css_compressor = :sass` for the standard compressors. * The manifest file is now in a JSON format. Since it lives in public/ by default, the initial filename is also randomized to obfuscate public access to the resource. * `config.assets.manifest` (if used) must now include the manifest filename, e.g. `Rails.root.join('config/manifest.json')`. It cannot be a directory. * Two cleanup tasks: `rake assets:clean` is now a safe cleanup that only removes older assets that are no longer used, while `rake assets:clobber` nukes the entire `public/assets` directory. The clean task allows for rolling deploys that may still be linking to an old asset while the new assets are being built. ### But what if I want sprockets to generate non-digest assets? You have several options: * Use the [non-digest-assets gem](https://github.com/mvz/non-digest-assets). * Use the [sprockets-redirect gem](https://github.com/sikachu/sprockets-redirect). * Use the [smart_assets gem](https://github.com/zarqman/smart_assets). * Create [a rake task](https://github.com/rails/sprockets-rails/issues/49#issuecomment-20535134) to pre-generate a non-digest version in `public/`. ## Experimental ### [SRI](http://www.w3.org/TR/SRI/) support Sprockets 3.x adds experimental support for subresource integrity checks. The spec is still evolving and the API may change in backwards incompatible ways. ``` ruby javascript_include_tag :application, integrity: true # => "" ``` Note that sprockets-rails only adds integrity hashes to assets when served in a secure context (over an HTTPS connection or localhost). ## Contributing to Sprockets Rails Sprockets Rails is work of many contributors. You're encouraged to submit pull requests, propose features and discuss issues. See [CONTRIBUTING](CONTRIBUTING.md). ## Releases sprockets-rails 3.x will primarily target sprockets 3.x. And future versions will target the corresponding sprockets release line. The minor and patch version will be updated according to [semver](http://semver.org/). * Any new APIs or config options that don't break compatibility will be in a minor release * Any time the sprockets dependency is bumped, there will be a new minor release * Simple bug fixes will be patch releases ## License Sprockets Rails is released under the [MIT License](MIT-LICENSE). ## Code Status * [![Gem Version](https://badge.fury.io/rb/sprockets-rails.svg)](http://badge.fury.io/rb/sprockets-rails) sprockets-rails-3.5.2/Rakefile000066400000000000000000000003111465251666500163260ustar00rootroot00000000000000require 'rake/testtask' require 'bundler/gem_tasks' task :default => :test Rake::TestTask.new(:test) do |t| t.libs << 'lib' t.pattern = 'test/test_*.rb' t.warning = true t.verbose = true end sprockets-rails-3.5.2/gemfiles/000077500000000000000000000000001465251666500164615ustar00rootroot00000000000000sprockets-rails-3.5.2/gemfiles/Gemfile.rails-6.1-sprockets-3000066400000000000000000000002041465251666500235360ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 6.1.0' gem 'railties', '~> 6.1.0' gem 'sprockets', '~> 3.0' sprockets-rails-3.5.2/gemfiles/Gemfile.rails-6.1-sprockets-4000066400000000000000000000002041465251666500235370ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 6.1.0' gem 'railties', '~> 6.1.0' gem 'sprockets', '~> 4.0' sprockets-rails-3.5.2/gemfiles/Gemfile.rails-7.0-sprockets-3000066400000000000000000000002041465251666500235360ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 7.0.0' gem 'railties', '~> 7.0.0' gem 'sprockets', '~> 3.0' sprockets-rails-3.5.2/gemfiles/Gemfile.rails-7.0-sprockets-4000066400000000000000000000002041465251666500235370ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 7.0.0' gem 'railties', '~> 7.0.0' gem 'sprockets', '~> 4.0' sprockets-rails-3.5.2/gemfiles/Gemfile.rails-7.1-sprockets-3000066400000000000000000000002041465251666500235370ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 7.1.0' gem 'railties', '~> 7.1.0' gem 'sprockets', '~> 3.0' sprockets-rails-3.5.2/gemfiles/Gemfile.rails-7.1-sprockets-4000066400000000000000000000002041465251666500235400ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 7.1.0' gem 'railties', '~> 7.1.0' gem 'sprockets', '~> 4.0' sprockets-rails-3.5.2/gemfiles/Gemfile.rails-7.2-sprockets-3000066400000000000000000000002201465251666500235360ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 7.2.0.beta2' gem 'railties', '~> 7.2.0.beta2' gem 'sprockets', '~> 3.0' sprockets-rails-3.5.2/gemfiles/Gemfile.rails-7.2-sprockets-4000066400000000000000000000002201465251666500235370ustar00rootroot00000000000000source 'https://rubygems.org' gemspec path: '..' gem 'actionpack', '~> 7.2.0.beta2' gem 'railties', '~> 7.2.0.beta2' gem 'sprockets', '~> 4.0' sprockets-rails-3.5.2/lib/000077500000000000000000000000001465251666500154345ustar00rootroot00000000000000sprockets-rails-3.5.2/lib/sprockets/000077500000000000000000000000001465251666500174515ustar00rootroot00000000000000sprockets-rails-3.5.2/lib/sprockets/rails.rb000066400000000000000000000002041465251666500211040ustar00rootroot00000000000000require 'sprockets/rails/version' if defined? Rails::Railtie require 'sprockets/railtie' end require 'sprockets/rails/deprecator' sprockets-rails-3.5.2/lib/sprockets/rails/000077500000000000000000000000001465251666500205635ustar00rootroot00000000000000sprockets-rails-3.5.2/lib/sprockets/rails/asset_url_processor.rb000066400000000000000000000011021465251666500252020ustar00rootroot00000000000000module Sprockets module Rails # Resolve assets referenced in CSS `url()` calls and replace them with the digested paths class AssetUrlProcessor REGEX = /url\(\s*["']?(?!(?:\#|data|http))(?\.\/)?(?[^"'\s)]+)\s*["']?\)/ def self.call(input) context = input[:environment].context_class.new(input) data = input[:data].gsub(REGEX) do |_match| path = Regexp.last_match[:path] "url(#{context.asset_path(path)})" end context.metadata.merge(data: data) end end end end sprockets-rails-3.5.2/lib/sprockets/rails/context.rb000066400000000000000000000024651465251666500226030ustar00rootroot00000000000000require 'action_view/helpers' require 'sprockets' module Sprockets module Rails module Context include ActionView::Helpers::AssetUrlHelper include ActionView::Helpers::AssetTagHelper def self.included(klass) klass.class_eval do class_attribute :config, :assets_prefix, :digest_assets end end def compute_asset_path(path, options = {}) @dependencies << 'actioncontroller-asset-url-config' begin asset_uri = resolve(path) rescue FileNotFound # TODO: eh, we should be able to use a form of locate that returns # nil instead of raising an exception. end if asset_uri asset = link_asset(path) digest_path = asset.digest_path path = digest_path if digest_assets File.join(assets_prefix || "/", path) else super end end end end register_dependency_resolver 'actioncontroller-asset-url-config' do |env| config = env.context_class.config [config.relative_url_root, (config.asset_host unless config.asset_host.respond_to?(:call))] end # fallback to the default pipeline when using Sprockets 3.x unless config[:pipelines].include? :debug register_pipeline :debug, config[:pipelines][:default] end end sprockets-rails-3.5.2/lib/sprockets/rails/deprecator.rb000066400000000000000000000003231465251666500232360ustar00rootroot00000000000000# frozen_string_literal: true require "active_support" module Sprockets module Rails def self.deprecator @deprecator ||= ActiveSupport::Deprecation.new("4.0", "Sprockets::Rails") end end end sprockets-rails-3.5.2/lib/sprockets/rails/helper.rb000066400000000000000000000307611465251666500223760ustar00rootroot00000000000000require 'action_view' require 'sprockets' require 'active_support/core_ext/class/attribute' require 'sprockets/rails/utils' module Sprockets module Rails module Helper class AssetNotFound < StandardError; end class AssetNotPrecompiled < StandardError; end class AssetNotPrecompiledError < AssetNotPrecompiled include Sprockets::Rails::Utils def initialize(source) msg = if using_sprockets4? "Asset `#{ source }` was not declared to be precompiled in production.\n" + "Declare links to your assets in `app/assets/config/manifest.js`.\n\n" + " //= link #{ source }\n\n" + "and restart your server" else "Asset was not declared to be precompiled in production.\n" + "Add `Rails.application.config.assets.precompile += " + "%w( #{source} )` to `config/initializers/assets.rb` and " + "restart your server" end super(msg) end end include ActionView::Helpers::AssetUrlHelper include ActionView::Helpers::AssetTagHelper include Sprockets::Rails::Utils VIEW_ACCESSORS = [ :assets_environment, :assets_manifest, :assets_precompile, :precompiled_asset_checker, :assets_prefix, :digest_assets, :debug_assets, :resolve_assets_with, :check_precompiled_asset, :unknown_asset_fallback ] def self.included(klass) klass.class_attribute(*VIEW_ACCESSORS) klass.class_eval do remove_method :assets_environment def assets_environment if instance_variable_defined?(:@assets_environment) @assets_environment = @assets_environment.cached elsif env = self.class.assets_environment @assets_environment = env.cached else nil end end end end def self.extended(obj) obj.singleton_class.class_eval do attr_accessor(*VIEW_ACCESSORS) remove_method :assets_environment def assets_environment if env = @assets_environment @assets_environment = env.cached else nil end end end end # Writes over the built in ActionView::Helpers::AssetUrlHelper#compute_asset_path # to use the asset pipeline. def compute_asset_path(path, options = {}) debug = options[:debug] if asset_path = resolve_asset_path(path, debug) File.join(assets_prefix || "/", legacy_debug_path(asset_path, debug)) else message = "The asset #{ path.inspect } is not present in the asset pipeline.\n" raise AssetNotFound, message unless unknown_asset_fallback if respond_to?(:public_compute_asset_path) message << "Falling back to an asset that may be in the public folder.\n" message << "This behavior is deprecated and will be removed.\n" message << "To bypass the asset pipeline and preserve this behavior,\n" message << "use the `skip_pipeline: true` option.\n" Sprockets::Rails.deprecator.warn(message, caller_locations) end super end end # Resolve the asset path against the Sprockets manifest or environment. # Returns nil if it's an asset we don't know about. def resolve_asset_path(path, allow_non_precompiled = false) #:nodoc: resolve_asset do |resolver| resolver.asset_path path, digest_assets, allow_non_precompiled end end # Expand asset path to digested form. # # path - String path # options - Hash options # # Returns String path or nil if no asset was found. def asset_digest_path(path, options = {}) resolve_asset do |resolver| resolver.digest_path path, options[:debug] end end # Experimental: Get integrity for asset path. # # path - String path # options - Hash options # # Returns String integrity attribute or nil if no asset was found. def asset_integrity(path, options = {}) path = path_with_extname(path, options) resolve_asset do |resolver| resolver.integrity path end end # Override javascript tag helper to provide debugging support. # # Eventually will be deprecated and replaced by source maps. def javascript_include_tag(*sources) options = sources.extract_options!.stringify_keys integrity = compute_integrity?(options) if options["debug"] != false && request_debug_assets? sources.map { |source| if asset = lookup_debug_asset(source, type: :javascript) if asset.respond_to?(:to_a) asset.to_a.map do |a| super(path_to_javascript(a.logical_path, debug: true), options) end else super(path_to_javascript(asset.logical_path, debug: true), options) end else super(source, options) end }.flatten.uniq.join("\n").html_safe else sources.map { |source| options = options.merge('integrity' => asset_integrity(source, type: :javascript)) if integrity super source, options }.join("\n").html_safe end end # Override stylesheet tag helper to provide debugging support. # # Eventually will be deprecated and replaced by source maps. def stylesheet_link_tag(*sources) options = sources.extract_options!.stringify_keys integrity = compute_integrity?(options) if options["debug"] != false && request_debug_assets? sources.map { |source| if asset = lookup_debug_asset(source, type: :stylesheet) if asset.respond_to?(:to_a) asset.to_a.map do |a| super(path_to_stylesheet(a.logical_path, debug: true), options) end else super(path_to_stylesheet(asset.logical_path, debug: true), options) end else super(source, options) end }.flatten.uniq.join("\n").html_safe else sources.map { |source| options = options.merge('integrity' => asset_integrity(source, type: :stylesheet)) if integrity super source, options }.join("\n").html_safe end end protected # This is awkward: `integrity` is a boolean option indicating whether # we want to include or omit the subresource integrity hash, but the # options hash is also passed through as literal tag attributes. # That means we have to delete the shortcut boolean option so it # doesn't bleed into the tag attributes, but also check its value if # it's boolean-ish. def compute_integrity?(options) if secure_subresource_integrity_context? case options['integrity'] when nil, false, true options.delete('integrity') == true end else options.delete 'integrity' false end end # Only serve integrity metadata for HTTPS requests: # http://www.w3.org/TR/SRI/#non-secure-contexts-remain-non-secure def secure_subresource_integrity_context? respond_to?(:request) && self.request && (self.request.local? || self.request.ssl?) end # Enable split asset debugging. Eventually will be deprecated # and replaced by source maps in Sprockets 3.x. def request_debug_assets? debug_assets || (defined?(controller) && controller && params[:debug_assets]) rescue # FIXME: what exactly are we rescuing? false end # Internal method to support multifile debugging. Will # eventually be removed w/ Sprockets 3.x. def lookup_debug_asset(path, options = {}) path = path_with_extname(path, options) resolve_asset do |resolver| resolver.find_debug_asset path end end # compute_asset_extname is in AV::Helpers::AssetUrlHelper def path_with_extname(path, options) path = path.to_s "#{path}#{compute_asset_extname(path, options)}" end # Try each asset resolver and return the first non-nil result. def resolve_asset asset_resolver_strategies.detect do |resolver| if result = yield(resolver) break result end end end # List of resolvers in `config.assets.resolve_with` order. def asset_resolver_strategies @asset_resolver_strategies ||= Array(resolve_assets_with).map do |name| HelperAssetResolvers[name].new(self) end end # Append ?body=1 if debug is on and we're on old Sprockets. def legacy_debug_path(path, debug) if debug && !using_sprockets4? "#{path}?body=1" else path end end end # Use a separate module since Helper is mixed in and we needn't pollute # the class namespace with our internals. module HelperAssetResolvers #:nodoc: def self.[](name) case name when :manifest Manifest when :environment Environment else raise ArgumentError, "Unrecognized asset resolver: #{name.inspect}. Expected :manifest or :environment" end end class Manifest #:nodoc: def initialize(view) @manifest = view.assets_manifest raise ArgumentError, 'config.assets.resolve_with includes :manifest, but app.assets_manifest is nil' unless @manifest end def asset_path(path, digest, allow_non_precompiled = false) if digest digest_path path, allow_non_precompiled end end def digest_path(path, allow_non_precompiled = false) @manifest.assets[path] end def integrity(path) if meta = metadata(path) meta["integrity"] end end def find_debug_asset(path) nil end private def metadata(path) if digest_path = digest_path(path) @manifest.files[digest_path] end end end class Environment #:nodoc: def initialize(view) raise ArgumentError, 'config.assets.resolve_with includes :environment, but app.assets is nil' unless view.assets_environment @env = view.assets_environment @precompiled_asset_checker = view.precompiled_asset_checker @check_precompiled_asset = view.check_precompiled_asset end def asset_path(path, digest, allow_non_precompiled = false) # Digests enabled? Do the work to calculate the full asset path. if digest digest_path path, allow_non_precompiled # Otherwise, ask the Sprockets environment whether the asset exists # and check whether it's also precompiled for production deploys. elsif asset = find_asset(path) raise_unless_precompiled_asset asset.logical_path unless allow_non_precompiled path end end def digest_path(path, allow_non_precompiled = false) if asset = find_asset(path) raise_unless_precompiled_asset asset.logical_path unless allow_non_precompiled asset.digest_path end end def integrity(path) find_asset(path).try :integrity end def find_debug_asset(path) if asset = find_asset(path, pipeline: :debug) raise_unless_precompiled_asset asset.logical_path.sub('.debug', '') asset end end private if RUBY_VERSION >= "2.7" class_eval <<-RUBY, __FILE__, __LINE__ + 1 def find_asset(path, options = {}) @env[path, **options] end RUBY else def find_asset(path, options = {}) @env[path, options] end end def precompiled?(path) @precompiled_asset_checker.call path end def raise_unless_precompiled_asset(path) raise Helper::AssetNotPrecompiledError.new(path) if @check_precompiled_asset && !precompiled?(path) end end end end end sprockets-rails-3.5.2/lib/sprockets/rails/quiet_assets.rb000066400000000000000000000016441465251666500236260ustar00rootroot00000000000000module Sprockets module Rails class LoggerSilenceError < StandardError; end class QuietAssets def initialize(app) @app = app @assets_regex = %r(\A/{0,2}#{::Rails.application.config.assets.prefix}) end def call(env) if env['PATH_INFO'] =~ @assets_regex raise_logger_silence_error unless ::Rails.logger.respond_to?(:silence) ::Rails.logger.silence { @app.call(env) } else @app.call(env) end end private def raise_logger_silence_error error = "You have enabled `config.assets.quiet`, but your `Rails.logger`\n" error << "does not use the `LoggerSilence` module.\n\n" error << "Please use a compatible logger such as `ActiveSupport::Logger`\n" error << "to take advantage of quiet asset logging.\n\n" raise LoggerSilenceError, error end end end end sprockets-rails-3.5.2/lib/sprockets/rails/route_wrapper.rb000066400000000000000000000003561465251666500240120ustar00rootroot00000000000000module Sprockets module Rails module RouteWrapper def internal_assets_path? path =~ %r{\A#{self.class.assets_prefix}\z} end def internal? super || internal_assets_path? end end end end sprockets-rails-3.5.2/lib/sprockets/rails/sourcemapping_url_processor.rb000066400000000000000000000041741465251666500267530ustar00rootroot00000000000000module Sprockets module Rails # Rewrites source mapping urls with the digested paths and protect against semicolon appending with a dummy comment line class SourcemappingUrlProcessor REGEX = /\/\/# sourceMappingURL=(.*\.map)/ class << self def call(input) env = input[:environment] context = env.context_class.new(input) data = input[:data].gsub(REGEX) do |_match| sourcemap_logical_path = combine_sourcemap_logical_path(sourcefile: input[:name], sourcemap: $1) begin resolved_sourcemap_comment(sourcemap_logical_path, context: context) rescue Sprockets::FileNotFound removed_sourcemap_comment(sourcemap_logical_path, filename: input[:filename], env: env) end end { data: data } end private def combine_sourcemap_logical_path(sourcefile:, sourcemap:) if (parts = sourcefile.split("/")).many? parts[0..-2].append(sourcemap).join("/") else sourcemap end end def resolved_sourcemap_comment(sourcemap_logical_path, context:) "//# sourceMappingURL=#{sourcemap_asset_path(sourcemap_logical_path, context: context)}\n//!\n" end def sourcemap_asset_path(sourcemap_logical_path, context:) # FIXME: Work-around for bug where if the sourcemap is nested two levels deep, it'll resolve as the source file # that's being mapped, rather than the map itself. So context.resolve("a/b/c.js.map") will return "c.js?" if context.resolve(sourcemap_logical_path) =~ /\.map/ context.asset_path(sourcemap_logical_path) else raise Sprockets::FileNotFound, "Failed to resolve source map asset due to nesting depth" end end def removed_sourcemap_comment(sourcemap_logical_path, filename:, env:) env.logger.warn "Removed sourceMappingURL comment for missing asset '#{sourcemap_logical_path}' from #{filename}" nil end end end end end sprockets-rails-3.5.2/lib/sprockets/rails/task.rb000066400000000000000000000041011465251666500220460ustar00rootroot00000000000000require 'rake' require 'rake/sprocketstask' require 'sprockets' require 'action_view' module Sprockets module Rails class Task < Rake::SprocketsTask attr_accessor :app def initialize(app = nil) self.app = app super() end def environment if app # Use initialized app.assets or force build an environment if # config.assets.compile is disabled app.assets || Sprockets::Railtie.build_environment(app) else super end end def output if app config = app.config File.join(config.paths['public'].first, config.assets.prefix) else super end end def assets if app app.config.assets.precompile else super end end def manifest if app Sprockets::Manifest.new(index, output, app.config.assets.manifest) else super end end def define namespace :assets do %w( environment precompile clean clobber ).each do |task| Rake::Task[task].clear if Rake::Task.task_defined?(task) end # Override this task change the loaded dependencies desc "Load asset compile environment" task :environment do # Load full Rails environment by default Rake::Task['environment'].invoke end desc "Compile all the assets named in config.assets.precompile" task :precompile => :environment do with_logger do manifest.compile(assets) end end desc "Remove old compiled assets" task :clean, [:keep] => :environment do |t, args| with_logger do manifest.clean(Integer(args.keep || self.keep)) end end desc "Remove compiled assets" task :clobber => :environment do with_logger do manifest.clobber end end end end end end end sprockets-rails-3.5.2/lib/sprockets/rails/utils.rb000066400000000000000000000003061465251666500222470ustar00rootroot00000000000000require 'sprockets' module Sprockets module Rails module Utils def using_sprockets4? Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new('4.x') end end end end sprockets-rails-3.5.2/lib/sprockets/rails/version.rb000066400000000000000000000001001465251666500225640ustar00rootroot00000000000000module Sprockets module Rails VERSION = "3.5.2" end end sprockets-rails-3.5.2/lib/sprockets/railtie.rb000066400000000000000000000216061465251666500214340ustar00rootroot00000000000000require 'rails' require 'rails/railtie' require 'action_controller/railtie' require 'active_support/core_ext/module/remove_method' require 'active_support/core_ext/numeric/bytes' require 'sprockets' require 'sprockets/rails/asset_url_processor' require 'sprockets/rails/deprecator' require 'sprockets/rails/sourcemapping_url_processor' require 'sprockets/rails/context' require 'sprockets/rails/helper' require 'sprockets/rails/quiet_assets' require 'sprockets/rails/route_wrapper' require 'sprockets/rails/version' require 'set' module Rails class Application # Hack: We need to remove Rails' built in config.assets so we can # do our own thing. class Configuration remove_possible_method :assets end # Undefine Rails' assets method before redefining it, to avoid warnings. remove_possible_method :assets remove_possible_method :assets= # Returns Sprockets::Environment for app config. attr_accessor :assets # Returns Sprockets::Manifest for app config. attr_accessor :assets_manifest # Called from asset helpers to alert you if you reference an asset URL that # isn't precompiled and hence won't be available in production. def asset_precompiled?(logical_path) if precompiled_assets.include?(logical_path) true elsif !config.cache_classes # Check to see if precompile list has been updated precompiled_assets(true).include?(logical_path) else false end end # Lazy-load the precompile list so we don't cause asset compilation at app # boot time, but ensure we cache the list so we don't recompute it for each # request or test case. def precompiled_assets(clear_cache = false) @precompiled_assets = nil if clear_cache @precompiled_assets ||= assets_manifest.find(config.assets.precompile).map(&:logical_path).to_set end end end module Sprockets class Railtie < ::Rails::Railtie include Sprockets::Rails::Utils class ManifestNeededError < StandardError def initialize msg = "Expected to find a manifest file in `app/assets/config/manifest.js`\n" + "But did not, please create this file and use it to link any assets that need\n" + "to be rendered by your app:\n\n" + "Example:\n" + " //= link_tree ../images\n" + " //= link_directory ../javascripts .js\n" + " //= link_directory ../stylesheets .css\n" + "and restart your server\n\n" + "For more information see: https://github.com/rails/sprockets/blob/070fc01947c111d35bb4c836e9bb71962a8e0595/UPGRADING.md#manifestjs" super msg end end LOOSE_APP_ASSETS = lambda do |logical_path, filename| filename.start_with?(::Rails.root.join("app/assets").to_s) && !['.js', '.css', ''].include?(File.extname(logical_path)) end class OrderedOptions < ActiveSupport::OrderedOptions def configure(&block) self._blocks << block end end ::Rails::Engine.initializer :append_assets_path, :group => :all do |app| app.config.assets.paths.unshift(*paths["vendor/assets"].existent_directories) app.config.assets.paths.unshift(*paths["lib/assets"].existent_directories) app.config.assets.paths.unshift(*paths["app/assets"].existent_directories) end config.assets = OrderedOptions.new config.assets._blocks = [] config.assets.paths = [] config.assets.precompile = [] config.assets.prefix = "/assets" config.assets.manifest = nil config.assets.quiet = false config.assets.resolve_assets_in_css_urls = true initializer :set_default_precompile do |app| if using_sprockets4? raise ManifestNeededError unless ::Rails.root.join("app/assets/config/manifest.js").exist? app.config.assets.precompile += %w( manifest.js ) else app.config.assets.precompile += [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js)$/] end end initializer :quiet_assets do |app| if app.config.assets.quiet app.middleware.insert_before ::Rails::Rack::Logger, ::Sprockets::Rails::QuietAssets end end initializer :asset_url_processor do |app| if app.config.assets.resolve_assets_in_css_urls Sprockets.register_postprocessor "text/css", ::Sprockets::Rails::AssetUrlProcessor end end initializer :asset_sourcemap_url_processor do |app| Sprockets.register_postprocessor "application/javascript", ::Sprockets::Rails::SourcemappingUrlProcessor end initializer "sprockets-rails.deprecator" do |app| app.deprecators[:sprockets_rails] = Sprockets::Rails.deprecator if app.respond_to?(:deprecators) end config.assets.version = "" config.assets.debug = false config.assets.compile = true config.assets.digest = true config.assets.cache_limit = 50.megabytes config.assets.gzip = true config.assets.check_precompiled_asset = true config.assets.unknown_asset_fallback = true config.assets.configure do |env| config.assets.paths.each { |path| env.append_path(path) } end config.assets.configure do |env| env.context_class.send :include, ::Sprockets::Rails::Context env.context_class.assets_prefix = config.assets.prefix env.context_class.digest_assets = config.assets.digest env.context_class.config = config.action_controller end config.assets.configure do |env| env.cache = Sprockets::Cache::FileStore.new( "#{env.root}/tmp/cache/assets", config.assets.cache_limit, env.logger ) end Sprockets.register_dependency_resolver 'rails-env' do ::Rails.env.to_s end config.assets.configure do |env| env.depend_on 'rails-env' end config.assets.configure do |env| env.version = config.assets.version end config.assets.configure do |env| env.gzip = config.assets.gzip if env.respond_to?(:gzip=) end rake_tasks do |app| require 'sprockets/rails/task' Sprockets::Rails::Task.new(app) end def build_environment(app, initialized = nil) initialized = app.initialized? if initialized.nil? unless initialized ::Rails.logger.warn "Application uninitialized: Try calling YourApp::Application.initialize!" end env = Sprockets::Environment.new(app.root.to_s) config = app.config # Run app.assets.configure blocks config.assets._blocks.each do |block| block.call(env) end # Set compressors after the configure blocks since they can # define new compressors and we only accept existent compressors. env.js_compressor = config.assets.js_compressor env.css_compressor = config.assets.css_compressor # No more configuration changes at this point. # With cache classes on, Sprockets won't check the FS when files # change. Preferable in production when the FS only changes on # deploys when the app restarts. if config.cache_classes env = env.cached end env end def self.build_manifest(app) config = app.config path = File.join(config.paths['public'].first, config.assets.prefix) Sprockets::Manifest.new(app.assets, path, config.assets.manifest) end config.after_initialize do |app| config = app.config if config.assets.compile app.assets = self.build_environment(app, true) app.routes.prepend do mount app.assets, at: config.assets.prefix end end app.assets_manifest = build_manifest(app) if config.assets.resolve_with.nil? config.assets.resolve_with = [] config.assets.resolve_with << :manifest if config.assets.digest && !config.assets.debug config.assets.resolve_with << :environment if config.assets.compile end ActionDispatch::Routing::RouteWrapper.class_eval do class_attribute :assets_prefix prepend Sprockets::Rails::RouteWrapper self.assets_prefix = config.assets.prefix end ActiveSupport.on_load(:action_view) do include Sprockets::Rails::Helper # Copy relevant config to AV context self.debug_assets = config.assets.debug self.digest_assets = config.assets.digest self.assets_prefix = config.assets.prefix self.assets_precompile = config.assets.precompile self.assets_environment = app.assets self.assets_manifest = app.assets_manifest self.resolve_assets_with = config.assets.resolve_with self.check_precompiled_asset = config.assets.check_precompiled_asset self.unknown_asset_fallback = config.assets.unknown_asset_fallback # Expose the app precompiled asset check to the view self.precompiled_asset_checker = -> logical_path { app.asset_precompiled? logical_path } end end end end sprockets-rails-3.5.2/sprockets-rails.gemspec000066400000000000000000000015331465251666500213620ustar00rootroot00000000000000$:.unshift File.expand_path("../lib", __FILE__) require "sprockets/rails/version" Gem::Specification.new do |s| s.name = "sprockets-rails" s.version = Sprockets::Rails::VERSION s.homepage = "https://github.com/rails/sprockets-rails" s.summary = "Sprockets Rails integration" s.license = "MIT" s.metadata = { "changelog_uri" => "#{s.homepage}/releases/tag/v#{s.version}" } s.files = Dir["README.md", "lib/**/*.rb", "MIT-LICENSE"] s.required_ruby_version = '>= 2.5' s.add_dependency "sprockets", ">= 3.0.0" s.add_dependency "actionpack", ">= 6.1" s.add_dependency "activesupport", ">= 6.1" s.add_development_dependency "railties", ">= 6.1" s.add_development_dependency "rake" s.add_development_dependency "sass" s.add_development_dependency "uglifier" s.author = "Joshua Peek" s.email = "josh@joshpeek.com" end sprockets-rails-3.5.2/test/000077500000000000000000000000001465251666500156455ustar00rootroot00000000000000sprockets-rails-3.5.2/test/fixtures/000077500000000000000000000000001465251666500175165ustar00rootroot00000000000000sprockets-rails-3.5.2/test/fixtures/bar.css000066400000000000000000000000231465251666500207670ustar00rootroot00000000000000/*= require foo */ sprockets-rails-3.5.2/test/fixtures/bar.js000066400000000000000000000000311465251666500206120ustar00rootroot00000000000000//= require foo var Bar; sprockets-rails-3.5.2/test/fixtures/bundle/000077500000000000000000000000001465251666500207675ustar00rootroot00000000000000sprockets-rails-3.5.2/test/fixtures/bundle/index.js000066400000000000000000000000141465251666500224270ustar00rootroot00000000000000var jQuery; sprockets-rails-3.5.2/test/fixtures/dependency.css000066400000000000000000000000211465251666500223370ustar00rootroot00000000000000/* dependency */ sprockets-rails-3.5.2/test/fixtures/dependency.js000066400000000000000000000000161465251666500221670ustar00rootroot00000000000000// dependency sprockets-rails-3.5.2/test/fixtures/error/000077500000000000000000000000001465251666500206475ustar00rootroot00000000000000sprockets-rails-3.5.2/test/fixtures/error/dependency.js.erb000066400000000000000000000000341465251666500240670ustar00rootroot00000000000000<%= asset_path("bar.js") %> sprockets-rails-3.5.2/test/fixtures/error/missing.css.erb000066400000000000000000000000771465251666500236050ustar00rootroot00000000000000p { background: url(<%= image_path "does_not_exist.png" %>); } sprockets-rails-3.5.2/test/fixtures/file1.css000066400000000000000000000000331465251666500212240ustar00rootroot00000000000000/*= require dependency */ sprockets-rails-3.5.2/test/fixtures/file1.js000066400000000000000000000000271465251666500210530ustar00rootroot00000000000000//= require dependency sprockets-rails-3.5.2/test/fixtures/file2.css000066400000000000000000000000331465251666500212250ustar00rootroot00000000000000/*= require dependency */ sprockets-rails-3.5.2/test/fixtures/file2.js000066400000000000000000000000271465251666500210540ustar00rootroot00000000000000//= require dependency sprockets-rails-3.5.2/test/fixtures/foo.css000066400000000000000000000000101465251666500210020ustar00rootroot00000000000000.foo {} sprockets-rails-3.5.2/test/fixtures/foo.js000066400000000000000000000000101465251666500206260ustar00rootroot00000000000000var Foo;sprockets-rails-3.5.2/test/fixtures/jquery/000077500000000000000000000000001465251666500210355ustar00rootroot00000000000000sprockets-rails-3.5.2/test/fixtures/jquery/bower.json000066400000000000000000000000601465251666500230420ustar00rootroot00000000000000{ "name": "jquery", "main": "./jquery.js" } sprockets-rails-3.5.2/test/fixtures/jquery/jquery.js000066400000000000000000000000141465251666500227050ustar00rootroot00000000000000var jQuery; sprockets-rails-3.5.2/test/fixtures/logo.png000066400000000000000000002456311465251666500211770ustar00rootroot00000000000000‰PNG  IHDR<xÉÌE|sRGB®ÎébKGDùC» pHYs  šœtIMEÙ v¼¡¢tEXtCommentAppleMark $«³œ IDATxÚì½y°l×uÞ÷[kïsºï½oðæÄH -’( ¤$J¤-K²ìdI±ØN9NìT$W\²+Žãrªì”£$J)Š,%€E¥©K"ÅA"%QÄAH˜b|ýÝgïµòÇÞçôé{û¾ñ@ô®j\¼{OŸ>}ÎÞßþÖô-XõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõXõX¯èp\÷¾nŽëÜÒ:®ë»´ëñR™+¾XG»×[ýu[ÆÝÇ}µ/7~MÜpÛý'A¬üý…ÛêÍýî(ÜY„pz=k×c=¾Üq‡îZs£µy»r×-‘[îLð¾)|«•µw‡ Ü¡öÕ¼ZùšÜqÆã®[#·Þ• ÜØÑ®¢ýïÖc=Öã+ ,#â·G¸Íö#&k†÷"ÆíN¼_ÜL[¦Êw¦àQAîÊ­(w®o=Öã%ñ Ù nýÚs­ø’ÄâŽ[îLˆ°&/ö†ïõ¬ p;ß:ûñÖ>¼õX¯ÌúÛÏÊ­ÏX_Ó¸f×ãE^ïLuWüö¸ïÿ¯Çz¬ÇKZ+×ÜÒúì Æ(\¬Ã¯º©ýŠ¿ãÞG€ÒØG°xw(Üf¸ 7÷Ž;ˆ·ÝFZO×õX¯Â¸¸­üï­ wq»ÂNEä¯=»¼·Ãô,ÍÄ¡ú J@Bdîxü(׿ö—è¾ó>v¾g‹æh†+§hh Ì™ûzF®Çz|y#¢R؆9€áèV"J‡‰€gÜgd:Üç˜ßÅ/¿CøÆ{¿º×ûò3´éœtìè89ï”[ã-Üi§§LŽ;Ìåvû.ü‡G¸ìÝÿWÜØ‘ˆ"GðŽ0B!~™· ¨†×Ã¥*BØu È0ÊÏò÷L~EOx]±g:>ÚQϼ§¯öýÆwÝ)]ºg¶Ïü0œÅð3Þã³Ý_G—žáøøåùËÊ þî°t.£AÉÌ õý Â&Ó–üŸ;üÂÉWI;ö,E{c ì >˜ÂGAÞzÚñX£®SÀþ¼æ>IúÞ¼!\ŒcÁ8°uP0T±œ‰p{iA¢à²çnöTÓ½N0‡ ä<Çq´mI¹#zSß+ûmgy‚/ñ~¥Ï¿û|gy¿úÙNw–[§îó9Vß¿ßß} È®ã–žáŸÂÈf¨H9ý.ãkÎ,|×Òzlص„mt¿ú©Ùw[q/«ßÍ÷Üï3}çþ¸Æ:Ť\ïU%¹‘1¢ Ñž›ïøç·Ÿµ_ãŸ_.üǾº^5?…E:É"a€9%S[ù(êoeoQqWáñó\Þrò”×ýÍÏpò¿ý¸è›ÉžÍÀÆt*˜•½ÉbB$» #âÝKºøTÁM|™ß˜”'®’3bN‹’<€*9 *-Á^Ú#/óÏ–TÎì76;Ë95¿D€•/ è†ÓW¾OUv1©³}º¯ü÷~ÀçþÒj_ŸîŽHý5Âæ^7)Ηý÷®·\c•px&å\²ô=ßoõ÷Ì¡¹PAo±‘90·„k@b‹gaža»›“p‡æ«nÞ¼ì€'Ž“—Àn‘S—î‚·Üi ¸|kû#|äÊÂE¿øyÙ¹8h¸a:•)NãfsBŽ EÁÑHB²DÜ5a÷>èý€†% ëª(x™G& Èj„ ÌÜ1WD•ÎŒ¨ŠÉü,ëÌ l¼Ãë—ABÎ’g £éÙm~fˆ1yaßûËg€/^ÈgŽO'=3;Ãgžíœ&å¤eþøÀÜJj©ÐÊÅdlF §ª˜/óÓU,v¿ «ß'ÒxÃóÑ9ü…™€Ùd±vYKêF -g<ÞÑ EiqàÓ“WàÕk(þ;'V^o.$FU·ppgÿ¶Ö¿ þæûîþ%äÈw<­ÝØÀ'¨1—›¾m†l÷ §Lt2‰ !]‰iFÐ= Ô^Àƒî®ØÞoºuU¨°H>#ĈёÅmD<1úŒ„ÉY©œqQ¦—èyiSÀ^ r?àñ—êUѯœIï«î¥œÑ3ø¬öý~gÜaÃìMZ¡2½:·L·LÒ€ºÐYFµ¾¹,÷%ÿ[¿‘ÅFÌòî‹&ŽLèÞ×3>s‚êð=ÄW1ìƒTÀ%/µzræyN¦ÄIÉI;©¬CNÌ_€—p/Óv¸êߤ:jþYt¹Õþ­\ýý?Äñ}^¼qPó†\ .˜9¦Br#F…®džd ÕÈD•ͦe‚*íä0êik;ò=;t7\(KßqàÀb$L#×¼áZÚC›$ÛÖuÄ6àY^Ù}Ìxö{1¬Gò™Mʳ,¼$fUØË—Ï@m_ì Üò eÿ²| ûoüBv)nw2†‹ Q¡ 9ï0ÙSµ>œxñ?kç¸9×ûᘕc-%pdzã.ÕÔt¤ßîä2¯½]ÿ2+çë ñ xæ#𫟙ÛÁg–n«Bvá‹O<É©Ù"-âŠ:‚ÀÁöÕx"VséR5_[Ç“”M¨·Û»MnIÇÿÕ3ºýׯ’Í@+2ÛRÜšH7›Ñ„HJ“Q7‚[-66hÚ³RåDñl¨'ægc8ÃÂßg‚{õ_Œ±¨‚Ã,±Ñ¶<ò©û9rü0Ç®¸ÃÈMƒaø±dïÛ³àwáS™”‚”Ɉ ¦Œªì1k–øcÔ}ª,ví3-jµ3šPg¾pÀXeŽï‰„—P"ºðÏ­rü¯2 Ç€%áÅùNÝ7»÷¿h@›ˆDáôü[í.ŽgÃd2î Lj!âjd3Ü*s³â̤^:’}`p†!æ¤ ß¼˜Éjtq å§Y½G(Á@Ç ’†ï£u£7Q™L ÆÑ°sQ²0̸¿:ž»öÌn¤è0Ü&?i—ŸøåØ·ÚØÒ4 €3I^Àf–Q ˜Mn¶ØÜ`:m1ËdÏÌ}e‡Ë–ˆ…Ùm…Ó_Vû²Ü½„¨”æJ9¢CÔ*šp Ýd#EÐÌìñçøü3ÏrôÒ 8xɠކ¼gqÓ dÅâ]Jû°e“ªoùbÂÈq½ðŠEýâÌ3]ú[Øí•Õ)#›h$ŧ´PÆ@V\»¼(¦¨Ã%úÝ¥°7è1¾Ö›´ûãâä+ߟûi¯†¨›ˆ!‹ÃìÔ6“ AË5Ä$/ m(‚’‚/˜hqH1eÝLÉn¨;âB6«÷.þ?ÁQ*㔀ÔO ‚±˜bžÁj0Î!Ó_õš•‡H‰$Ä•@,ÖA#‚ !¾ê¯˜‘·G¸üvînÿèO¶¼Å“ §á}‡þÿð‚Ýx|ó ÒG­ EO-Ç78¸µITKˆÏ³š:"xx­h^<à¥Å¹kq¤žßÉ^³7y$„ÙˆRØ” d›ã!Ú¶ì¦Ù€†ÉŽñÜçžfçÉ9^|óKq§Ñ@²„«´0Ê`N”€§\äHÙW\)üì¬fÅ‚ïãÙ‹³q0‡);½Ž|c=kßßtôºÐvÃÒ"¶°,F\ºÈ]LaÃãÙ•¶á8eð—↨áb˜(NDRMßÐùN‘pAR&¨wX„Îç$ÉL4MÈÉ(†Wa7s›“ƒÐˆBª‘HUÜK$UD®÷®G›¨ŠT–µ2̵#†H S°œ¥Õ@öÈΩ9›‡¶0q:K¨ šAI¤r£puDÍRžéÈÅÍ—±j7€¨câh*[dÐÅfâ^JæåØ@‘Uî¶çŽxÂDÊZòPÓ°B"ê´ )&´ÈCfÄßþի͇w‡ŠßVTNä–ö6îL·"HõŽH²dæîBÒ}Œå]¥Íaù÷–ðøö¾jåK¬pHZ˜ I½T ZíÅù¼¬ö”ÙlŽD¥ eÞ˜{ÙˆRšQŒHV1"ÄØ`–Ëkr7§ MHÏ„ ¨;É¥‚€$²D ƒøRJ‹‡r掋0™L ¢‹ˆ¯f‹è¯yÞ‘f3ÂÆSÁò‚-ˆH¯X²HaîSZ`HŠWé9XÙ8En¾x»¢Ëg ¸ô†ƒ¼r ¶Î“övj¡ wÍ«aúpôC‡dò†K¦%´ §sBDQ3RN´Ó–‹¥m'h$Ï ™×²“áN®á~ƒ™¥Å¿Ç><ßm­2aWøcjR±¹Èxv&MÃ$B bd3 V*‚e‡œ°Ç/<÷9^v>ç]z•Ü4ÌÒŒ ¥k)~G`¢ÅCr:Ïh´]…/.Ù t)€¶Údõ †º2=FDd¹vÒ‚4ëèwÃjC<¿ôÊà°?÷è¸P¬µ¡šÅ]Q©l0(ˆÓR“K4†Àl'Ñ´-ÎNaþY mC˜'ˆRÉ“U3= YØh7™Y"»£º˜2ºº¼2ƒc½0/ B ‘&D<ÔÄiËK÷ÇÝ eÓ1ãô©ÓžNÉPÞ3„EöªäÂþEòˆ­iu{¸ãA†ãú¿—ßÕ`›T¶‡ã⥲D¯yVý½²ºWÖxÙï}ß{‡ðm0Çý@Y„?iÿ’ö¯¶äÄŽnnhj”œ;¦!ÔÌí9L¹àèa6£攺2]DjÔJê4ÔÁ´`ayEða/Ø­6¿û…Ú³DÇÜ m'›C FŠz=åbJÅPL+¾‘¨Ê¶+í6ìÜû>ö4ç_{)Íá)® ¢J’š•à AIõr'm‹¥Õ¾µ1¨¬Ü‘úÒ–½|>ÕÕOü\{+MÆàºð-ú.@\ öóÒ!»â2óhSÙo2tÁtú+È–uRšÓ¨UHó[í÷Ͷ4‘47ÌK>”FpËñ’òî:U¼3æ–q2“62ë:4´{#κ|C¬‚´Æ2Gb M$h ³\"¦,'7‹õÆ JJ Òl†N,–ÊèÞú5Ðß;_"ß>0¸j¢ZVJòò£SP«æï’û7°­Ç+}5H‚/.Bÿª¼ßtÛmÀm=ã¸cçüâ-•“õ’ƒê 3…•˜!Ïg8²ÉçÆS"w©$K†Pv÷Å"’8eôD¼wÕ3îìv»ÙŒì²Á|•â 2lØÚcT‚,©ÔLe…ÕüÉ9ÓÅEÈ(ú|âKû"ͱƒ½öRæVÌÙnNˆ‚¥›eEcCÊFÐÕõªcv׳±=IÕzv0ä,‰µ¾Â±·\.¶W¹ûý¥÷QfY‘Š3:¥i}&Ñàb`%dO4Ó@ÊN'‚Lfžijq„ B“­l¨9—è$6܇¹%tÒ"Vü))ª\»}öv¬Š€åÕ‰ ”¦‰„F‡@Mò„!‹Ò²ÝÞ€ê·hD9ýì ¶Î?ŠjaŸ¦Å¬FëÖ“Ë× älÔi602•»/,µgé¶H¡OS©.‚þøpÂWîxÙïvÁn÷÷¶€¹Èþâu?¡ýÔE›$4-ss4ˆ‘$qôÈç=„w‰Í&Ò¥ʶTƒ8øèêƒSïw¼…²»^ Ø­Î5+åc%ùÓ­Äë‚*“Ðs‡š˜Ûçï-œ,„jJw’Ðì…¬…‘vObû¹»9tÙ1Îí…l/>Ë,„J"ªË"» ´tÀV†9ÇI¯»™×2nÇ€¸ŠÍ™ð™Ñ]†û­ºìM–Šéw6r³šh%µ"±”g™!(s‡#—¼†Ëßð&fMÜ”qÏLý=ò0iû4sGNîðä† M[’~#‰4ßABÀU Q’/üŒ*R&n%7M #×iÛ¦€¨ÙûÜ8Cµ)9mâ5Ò©£Èò¬&ÕŸhÝlÆds÷D1rÅ3Ã{svTC›½„SEf­æ½›ˆÉ®$h©ùz½‘[Í]Ä@–Áo(_{â˥ţÔà\ÓþÉüÂEñàôÀd"ÉËÍm’#–9¼9å¼ó#– A˜¥yYÙÕÝ]ι„Í¥Ï-ÊË:½Y+2¤ŒS!v…%VF9ûIe”ü#ñrä4B(ÉÈF®Qà²hûësS²3W­äF…¶)NøùœÐ40K<ûùG9ñè“\üº«Ƕ˜å­Z„™g¬ h^xëvfs¶÷Ùì1ƒûHmEë|…¯F—ÜU5ÍTΘb3œOÀF |φb{MßÝþFC‰”û¯@%á5?1`.HÛòÔ ÞöçþÄšv¨Œ¸ª˜ç>GEkÔ7ðÔ’Ÿyš'>öQîÿíßäPÞfG:N«¡M…• ؓګ£m4B,&cÊy±éE­é!=›«iH"˜”È«i͵´L"Ýéb[ÜATÈÙ+¸õ¦iñkjîÍVÐZÔÍ–ëuêxåýÍd°PØ .ªCZÔJ— çþé9q Eáv~Œ/üЗ¬»îhleÒ•Â׿j'\tø(2ß!tdºž]I(¹‘ÕG¤2 wÌS}r¹Dh=a’1ae)Î*°;cº…þ« +“ØÇçÕb”¬ôL¨æI¿Û÷é ÉÝŒil VòËòÜÿñ»yô¿HÜV$¶lÒX" §’¥—Eƒ–.õµÇ.\õZÄñ*H+¡?GÐòAU뫲³ÑËE–>wéµë:}ÅkˆPê⧈^£shƒH@ %ÝÄ­£ eF`N9'O<ÉCÿ}^Á)³ÞÛ‘;ÚÞ/E„­‹.áðë^Ǿ÷»ÙÑ@G‚àmqQL²‚,®)(!(¡‰´Ó) N°3+~äP?Ç܇#Œ¿S¤Þ_ û/„Ùöv &¸-ùûTÆÏmñ»±@÷µ lin óh×ûTdòåI›½ì€'þVpù™C÷ÇCÿòÐt");t%•C Æ‘#‰2§Q£³íú0Z°„[ZÐqÜ#BSkô’Kº¦×äIó]É«ã÷,ÀФ:”T0­{¹Ô<9Ëel´q¤Ë4žiÌ }tQ#’ ñLôŒK,/WB(3ÉEÂÊ•˜”ƒ¶ÅüÁçxè#wsòž'ØÜ ˆ4ÌÚ‹%—ÍÅ 8Ñhp¤&`Aq)¾¾FAʼnmDš€‡°Ï„CÙQQ èY£\A‹å€j(u¡aŽ6%û1 D‰ %ç¬f º‚=’j,ê2ˠ踪dD® ‹ Ú">ÁdJ¶ÈÚÒæŽóä$_ü£÷ƒÍ™£d˜ SѧAˆ…½ˆ½Ûcz˜+oz];!«´!jÄCÙìbÑ(X€°Ø<²Éäআ—„¹*•T| Nùª¶FÀ­Ï¿Tj&•izaaý†b™Ô%$jLÉ÷óÞSA*Ž|}kØ`Bùwîøª ¡rö÷¿”W07)™ÉHM¥¦Ñ EÿQFÁÞµa22±ª?ð3öjdxS€Î?ú§[¦6·¤s'‡ˆf§éǦmËÃu iðl„šÌ¸0½|yaîkG/¾vΜz²žØ&è%hÒD]§òÂkIû—/&Éø%A™›¡ÚâIxôþG¸ÿã÷²ýð ŽÌ7éb‹è„°AK@ŲL›…F×HÖ@Š‚hD’—Di-ê.ZÝ|v³Céò˵!X`ÊšGŠ™S²ÃdÚ (ª'’‰Ý ÕIY#š “²XÆ,å…2è–… ûóPÒE´:æU!D”yøsŸcþÈ£L¼úrôÌò¤CàQàÊë¯'Å€»ÒJ™b«K©—FåÀ¡M¶, ĶH»´ÿ.ýÒ×* µô½l8. Ql!„Hˆ îÂÎö¥l’½éßú3è1Ú°‘‰ËÒ|.÷Nö¦1énoÆÂàÚù²rñ®Uš´ÝüT<ý÷ óL'‚…’ätP#çmMPœ¬BòZæ@ê–í# ÛNãÂèÊäÜÏþöH!û']%&±]òÙ’, À¶Šáö`·ÛGèÀÜ©esŽde“ º§ç<ö©/òàÜÍä”Òä s ¤¶äuiP6'-! !ÆêàH Hh4ÐF¦K¾]æìYÍä” ˜g%kDCÃFÓbÞdÄ3SsT2Û¡c¾!HŒÈ<¦ c“9è 2Ñ +tD•¬\ƒ[ª N†4ÅÖe#Ág>ø!HžjŠ…ï &÷Q¥d¥`Î…¯=³¶%¶ š;b œVã³qt‹Ãç¡¶EÁZ¼|‡Ê¼)ÜÐŒAOX6ÕE}ôõ\…% ¡Ûža)££9,¢C!¿ÍPŠÙ]‚e»€«¿•¥ìô±k¡'‹:°ºá{@°tJ•³q¼|‰Êçà=ÿ·ø¦Ÿ˜hh7ƒJ“K™^èü‘Ã[4@ö.JBkr© ž—À®þÙYrìÆìî…€]ê™ä®H€»&ZvZ8}FEHgayy…¯pÐÕä|2;ª5Â×e¢bŠÌŸžñÀo}‚çî}Œ‰Oñ8¥k>‰d/éÖ.J«-“8¡Õ¶$ºj½TSÆ@2ü;_Ò*ƧaÁ m#¦aÊ$kQÿðcFŒÐjD40,!]ÜœB³/së¯w#Œ]ÿ@C% Ì%Ô.ZþÖû¿6îûÃÃóÏ¢êÌGëo÷tÐØ£:.8ƒW\NÒ@´Â›#›ºàÍ´!I&©! @ð⺾=]˜˜=èõ¦êÀpÅ@(N'„€¨©FE\I;–Šr·öç)ªÞÔ¤âq²w­úèÍÑÐl“3>™°¦»ª9zæ·J¢ëlVÖ«ð\˜>4Ùùm¢ä>‰·ËDwBT6n˜UÉš2%»¾¦µfÀ«—W‰ÊéY®øüŒ@׃Ý„êÁNt)ï¢UaÒ´%R[Ýî>ʳ«¾óÒÿ—×Âo(µ0[=Ó*I¸$ªÇ»N°Œå9“yò3p÷{ÿ€S÷?ÁÔ'8o´i Š˜AˆÄvB”@#i‘Xüi"Êÿ£ÑÅÿ÷Ìolþö`Øæâ»š·VêZ=Ò¸€oþNN<Êó¡!ÐР®´92q%ªC3+`s†…10cYýŠª‰h¨Ærc‡¿zQåÕˆäÄÆ#û0xf¾Úe_mYHŒ´S^ûæ·2SØ88åÀ‘-Úƒ›x#äèäà%¸ƒc9áî4±)9o+@oTTàÓlTª?vØ ïA¼i"óÙœ4Ÿ«©í#«ÂuT¥RwÏè+*j´Öh÷Ÿ@æ£HkŸ^Ô³Æáo2:Ï‹0kíeBÃs –ö=ßÞ¸œnlH6%F­b¯Æ‘#‡J³@”@ÎZÀH¹H¦«³dÆžõFËøØ°'Ò4>‡Õ:–”a‹’…MˆDY\Ã`¼;0#{º»ÿæµ/@Iq)Ç¥”1’ÝÈ”Âñ2 ʶÃFœ`'3ÿáŸpú‘§¸è¦« ‡·è4Âr.ÒA\š"\)ÊÔŠ¯oœ)Ü—•k«Ú~ÂP`¾ûN˜BÄ媷;ÇßöÍL6°ñÚOò‰Ÿÿ9ÚٓئrJŒ””-‰LÌ™yÀsw.ß}ü 2óŠ—ÔÕ^þÝlMhé,ãâh„)3>õá÷sÉÍ契¯ênCk\9 à4\zÝ ÜwÞyl0#k.þ³\RY<””ñÂÈ©Eú2Ô»”ò;W/Á5|‘ËVÛWù²ŽA£R Z(¥R‡œKuÉö»à7|ÝðýÆ¥Á>by2N¤p¸âº«yð*rW{ú[”ÁB¼Êûð^ç©öHµo[áC´4çåJ—AyE‹K!¥ÂTcÌÓ¼ÈD!Ì·g´“É ^¢5yl‚ö‚ #©±½™xºëþöç°Ëëÿ½ˆb ôGì£~Ž`ßK—¸ë®†6nÅåδÄnî@¹ ã®[#·Þ5wÞ;ýü§o~><ûÁéáC"CjFòœK/>ÎFÔ⻪`fHITê¾è6<g%ÓKØ>&n•y­ó˜ÖmÎ(&¡¥LëΦ(‡&gô~•| Ë2ïó¨&±Àô¢£\|ãÕLÆJZ9¥‘‰ꂳ’X[EC¥+ÑιE“².3)4ä#ÇxÛw~/áš×úüö(UÜóºÚSÏóþÿý_Ð>ù0bÊ\7H¶Ã–Îè¬ÙÃÜ–\öÁ¿Ÿæ_Nyð-öç2·a2Hö¡8^ ¥¾UJ “$³œ:º–(l>Èôðf©+U!1Üèf3lÞ†Y*bUGÐÒâ³Ì­tEá³x|¨ß%¦Ñ÷ȆxI(v3&“ ÝÎqÁ³K…Mze•9w¸F¼°y eg¾M¦¤Œ¢sfÝbÐ\O,+Ùçõ|^· 0K®LÕ¬d3ä 4JuP•T«Bl^Ü´øÓ«ì¼kÃÿ'»ŒÕ&AO>ÿ¼?œNÛ¯ósW ßõð+žáÝÎ]#t© ²o«ˆsËÕ#qW¼çŠÉ_½üé© fb2…Ø”öu" ý^ºziÓH{ÍÓ,m?°{a[BQ‡ 1º9AKnÔ¤™p®ŒAµÇ>A“€K¦uÁ}šÏ=ú$ǯ»Šã¯-ù@ ±AĉI+#bÈfXèÈž‰S%§‘Ì’0"Úåµ_÷6.¹ùfr³¸ûN\ìž¾Hë`c“w|ßó?ó“lÍNÑÊ Ue¶ÐáÙŒ ËEѾ‡]¢ ¶Àž–h£dw:JºÖ”›’!Rœñ)9Ú )'¤Q’u Æfh™w;hÓ0·Y”CG°uèÐ ùEµ,R×ÑÕÍÑjÀ¬uè%Ù‹À­D¿Šw¹8ø³a©WéYpɤ &}ôT­–ÏôÌÑ¥vz±=bµS=ÂÌN’ºt³ ¦Í&yîDO¸8ó¤D6P ¨Hó†¹d,ÌVôKðȰÝÅ€½­*} ƒ–ž³—áî­§=·ª1þ”Ïí¶á_·õmu7M6Ûo'›JÃÞû¶iê)·Zõ½{è©ïí7¶Øí¡Ýûdb•æ[*b¢æ´m$ô‹á¢é¾«/hèí0ƒ úôóì<öy6rG–…߬ï‘랇ndÓ‹ÔmdMn07²u%bŠÑÆ–iÓrz{‡J‚Oò”^Z›UdHãü£GË™ „lƒä’˜á)a¦ -MÛ`9‘-àðLÔˆYBC ›Ï Ëërav9QQ 5š,x5!û—»ã©/Î/¹ƒf^ƒ^ÔŠ2‰”%TŽõ–¹8LÞøý?Ä ïx'þùŸæ¹{>Iœí=”xÍHîhðW'› RZ£ÛRבTÀ+é3Õ UPÛßÅB5Áóª¶rØ+ðö5³VðØ»>­ÜrkE§?nB6]V¿-«¢iÂ@u-ÝÓÁÊ}ú†qûçä-L/ßë]çŒú$ŠÙÑ`l„–VŠ?'{Wª^n«V Ý§¨gÄM.fOÓNèºTôÝ´- ÑHq.öa>uÿã\xãÕ\ùÆ7Ðhí‚Ð;j´4´)sòO>ÎçeÎkßõºf³¸$(-æš^üTt9ê‰VI{¯’ä6ð¦w¿û ? §žB]÷*¼V+$ûRÄÝCyM³AòR¨oÏÎg4ÓH×Í ¢´±a'6ÑÇ8rÉ%ºàœ5mšM¼ d„¹8Ž-RL¥ àÌNœbûÄ ¤ËÄÀó“'9ùÌ“Èü;ÏÁö—㹇îçÔã0ö ¶‰9±39Bšw¸*êJ¶D£iE‹m”Gµ·.%Ù¥–§µóÓlïœ ôa4-—}û{¸àúëùàOý$öè9µ3‡É„˜„&e’e¬‰¨ ¤šöJ7ùžÝ²BÏF#“‘°†Ô:æ]©,gÚ×àÕ Ea{·W:ôˆrœôëñÐÛ>r¸´q" *«Es¿´Æ÷õ4g3Õ+Øéõ²³'Ú¸¿¨¸‘….Ó´¢ô¥CsB %íàe¹FÍZÙæâ$‹N0!¸•‚sÛš ¢LMiS&˜5¥u_xæKÜ÷ëïåð•—påÛÞB>ÉS‡Üâ.4Y¹ï·ßÏ6®y¹™–ä‹N>+L­ÊÏ:D“Uó_Gy˜îž?® LÇtžÁ@°Qu‡ù lKÿlºÅW\ÅáË®dëâ‹9pÉÚáYk¿—Õ´J å¤EùddJ”¦g%¿²WüÝ-f){çT‰ËI‘rBp‰ ÂÑ«®€ó ë`ûO>üO<ñ(çÿñ‡x衇Ȗ‰Z7ªü£Q±l˘j•FŸO7m2÷=ú¥P”Òhó²kx÷߯'åÿâó¿óèɈLHí&]îÀw0+—L‘~/Ùð}àÕë³ÿîLªžƒ È_YÀ“3†c Þ§ðLâ}·ëáïyâüæK_ÝéHYÚ)m×köG’UÝ9[ì*¥VP—e°+Y{DÆ%<Ë£8tË¢ª}Z­DÒ÷äœÛ†M­pëŽi,À|TæE Æ*ËD5ìªQ‡I)- ᵘ¿]¦mŠó=¸rêsòÙÇ~“óo¼ŠK¾á&NÇâloLãûÀG¸N• ®¿g‚Hô ÈzÆ—±\ž èÏ0ûÒcœzâq‚¶Œrª]ÀÓT¤Ô«=Õ ¥LKÑH'¶8]y9zÝ×sìø1]p¬oN;¸9Ü}¥ ¾Œ ÙÛ |!'/tÞ3$èìjq¼'”8pÇ®?c׿‘tó{¸&Á‰ïáÑÏü!ÏÜ÷iN?ñ ²ÄÒÇÄKTXrU/‰ãî"Ó lŸD*ß%5¥ä«îÀ&o¼õ¸ôºkyßÿùsسÏ-pÛ £+m)FVó Kܵ6©¾GJ©¡á‹¼-i6êý¦U”RÜbB¨ªDI‹k¨oiZÆÛ¿6£´+‰V.Úäæ‹{K3eÔêo?¦¶*´ìdÕiÂî­¨<çU2ÉÝiB¨f’,ĵì•>"‘¬™óÌD”[vNmóÄ'ïæÉ/<ÀÕßðu¹ær¶k÷¯­8åÞ÷ÿ>?v¢ч ô½ì¾¦hönω?ùàïpòþ/p¨sº`$¥žZ·ZKy©\ËúºÍ .¸îŽ\u5ç]} U!v('+[›.U,õU;'}JÛ•W]͵W]‡Û_z‚'îþ§¼‡'>û æ;3r,|9§ya»A9eSnŸä×þþóÖ[~ã7¿ƒçc`  ZNrøÍïä/]zÿþúçÌîÿ4¢Â)ihLÈU¬ oôcê{h›Ôò·eïÂ>’—/Ç/zõ¾z|x/Ætô‘íï¾²dkì[ÝelïqaODv‘ðéK”±²#MÛ@ÔX˜‚ƒHeNø gç蘋`‚HÀÍÈâ´¢äyŸ:ÉÝ¿ñAŽ|æ"n|çÛ™Ú`'µåî_ý-.úþ[9|ø`ñ‚U·C —^ƒŠ)`ÆcŸø(}øƒlæ›A89-¦QcNã¬ËHTc>Ûa²ÑÀä0‡®x G¯¼†£W_É6ª(Ñe0¨•½ªß¢ïç&ZbÕK¬äŠöØq.=öïáu§Ÿã¡þ.þÑïrâûKŸ\m±4c‚³ÝDœðüI>úSÿ¿ùïyËü áÆ›H±!¢4V`ߎ_È»ÿ«;øàÿ¾ÿ·80?IÇ´öž]f¨­:¢U¯)’Ù‚ 9y uÙ‡¯o¸Ð×fŽkbe¹û˜É8µ¿±gº¾>vº•‚ àË£F@‚Óª2цQíúÂÿ'BðWxÏ:jî^6ÐÖºSwÇ¢öÖ…Ó÷?Âü®ü¦?Ãùo¸ž¼Y&ø}¿ö ¼åÝßGŽB[ÏÜçbœxüAîùÀïŸ~žÍØbM §Ì–‚¥Nçsâ¤äÆ™pþÕ×ràÚë8rà ՅPW®Ýk›õ‚“,ê^‹œÕ¨i·sβñ˜0IE0ÀÁG ¯7sÉÍŽËn~ùÉGxðƒïå¡|„yz–Î8ßÁƒ§MN¾ÿ>~ó'þ)ã7ñõ?ôØñc¥ÙŽ7dlk‹oùÿ÷:ÌýÒ¿c’}¹iOm˘{=À1hûDnû?RJó®¯/wÞê¹ôðûÒ²ò¼kY©Eî˜/ûIÌe(ëYv^•í €ØG‰‡\¤JÕƒ@A•P›H{ŸÚw‚úèÓ©ÉXJʰÒêÏkn˜Ô<­N€F™yô÷>É“w×¾ãظúRŽž:Ég?ò~®}÷{Ú¡‡GRù6ýÑðôŸ|†¦Û!EeÇ“<¡‘9¼ôÉÎÔÐM§¾î.zÃMÄÃç—{]{; `2GTk<+´hôõSÂÌ–ú u²¤üô²Yœ- «¨U—‰w%cQE]ÊUñGyÍ÷ÞÂûCîûà‡xîÞ3õ)Ò9óð0ç€8Ïø÷øÕOßÃß÷}\óžwAȨÄ*)¸âºøpl˜äù‹×w5sí¥Áú,)¨,\NãÀÙÙ×ÂÐëöÕ xE•C냖’ÛÄ¢YEš•ïÛÄ< <¶®ú8&÷Mzz)ЄÀ$4{Àn`Ž_#£S˜ ,»tó2‚C« 9•{“CUÛp˜}é>û+¿Å¡ qñw¾“|ö7~‹›ÞõnÒt“˜!>ñ,Ÿûý÷³óÄÃ4’!n0u%‹AÌ"ón†Æˆ9Âeæ­œwÕ5XˆC¡Tj¤Z«¶ÅÞÇ>H/äÇWƒÝ97ŒÒÉ­v‹r0ŒÖ.Ahy 8ÿÚ7rþkoàMöûø£_ùîûÐû9fH(U3a¶Mxøn~ñöãé/sÃw}?¤ˆgcSçä^†ªšÿ¹— 5oY!`ÁŽ—’Áû _íræ •«n¸Ê«ðzŸõõw#_žŠ/CžŒD&¡Ôóê¨Øíøš`xM:¡ ÐaɬJ®múú„auˆóL£BçéMaÚäé?þßó®}ÇÛÈ<ÆSó“l5BÈìBÛNÈ6«]¶&l^x1Ýô&/¶o¿(’G}Ú^¤T€HÑü+ÜFyu»ãCîÜîGϹ vÕ…WTrUÖÖ…"‰Q i‡¹§RDI#;@ G/æÍåopÃ÷|/ŸúÕÿ‡‡~ç·9Svòœ­.ñ™_þîûãóÝõ?b¶ó,;iŪøÁ¢ÄLFëb^+½>¡Ö E¿6‹á>ÏáUmÒâ%2Ô3&µá+±H× ‚“ƸïÙÌÜ=½(t¯j®õúhA0rUÉÔÈ&¥ìÇ‚b£zÀEKÅ>à^ù Wz Ë1†!0mï4µ^¶¥í`ÚdlíœäÞ_ÿ ½û^®ÿ¶o!?ÜPª²¡a‹|ðÜô.¸êʪíÈÒ Ô%¼;è^Àêy¥EÍã˜öì¢>{Òiâ*Ã{;š åù9L\È7üÈßâ7'¹óg9ñÙÏ0Ù1æsÚaŸÿ¿ñOþ1Ö%&Y¦¬‡4@p%{‡7‚'C²"p …H*"¼d¼Š$•¢çç.NŽ¥ÇŒ ÄÒØðânzuö´3«^Î=“z¿ˆìþ&¬–ü:÷=ÖÍð›Ô•236Ú񿮠F<!ðµÁç¾òc:ÏÌ5à6¼…{æø¿¹àëoàúoù&˜n&\pãë8ÿº«Kžœ+!ç‚ha}_Ú–>/xèÕín4¯¹†wþ½ÀsŸúïÿ·?Íü‘/lNk›t§2®BöŽ ;óTØ·,g:ÏxˆäœkSï"öéjr¾ÕȬ„RàŒZ9Ž#¶çÐxÙõ[öª£5·ûX;[>Þ ³šl4ª´ÍU-¾Œ!ç.Ÿtü\ÚNhk{ÆÆ8w8˜:f¿÷)~ûù9Òæ®þî?Ëá뮈 s1R {KÖãE\9­Jiˆ*!AÒÈäoá{þ»ÿ7ý…&NÎ#åR3#‡Ž&4tÁÑš\ï.¸ “f YK¸bh ”K ­–(îRÚUëé\gÔç$ãO/ñ}‰ÀJ3v·ßÎ÷ºâ"'ª’ºŽÍ)ÈP™Æ] Øí3ÌëÕÈLé$AtAàKbl½éõüÈý÷˜^w=}öª‹‘$¥ìÍX3¼—º€k6U±Ä³•¼¾h%ZNĘpõ÷ÿ WÝüv~÷§ÿW¶ïù’wœÐb%@CÀ<#A˜ws&!’rѨÌR¤Æ\ 1/圮göck‘–’sŒ&ÄWʃÍgP&ٗщïÏêF¿·lLcdª RE…9½»ã˜¿àVt_ûÃH´M Ã˜g'9·ýà-¼þ¯ÿ(³¶hæÅ }ô1º–ü.)]0âú¾TŠWV4ïBÙž Ńֈi™èñØå¼ã¿¼ƒ‡?ü~ïßý4Gwže–ËÆžIh°Ìœº¡×‹WI+éÛ„ôMÞñÚ|^° HfÔWd/1Qdx¼¨¨îµÇk˜±ÿÎj‹3]Ÿåû±A)>ˉ›kiTUêèÅå|1³Šã¶½04Êy5ÔB3K„Ø2¹éþìßÿ1¾îuLjW9Bi>#q…¡¯Ÿ ª¯ð±`C¨ªÌމÒ5N†T ¸ —¾ý›ùþë®æWÿíÏ?ñ‰¢>ÑyGPèB‰G EÙúNzi.)ëÎ*²­ìvÖ—šù*«îUìÃÛß–ÝŸBÍG7N,^ÕÕÞdyçÙh¥Tl”s×Ö–×¾ck;ðìÖ¯ýO~”[~úßpàÆ×‘júˆkõùK.‰'cêи¼âsÏ…ÑH!¦Q"„ˆ-$ó“± Ë8;dÍø…óçÿ‹ÿ†7ÿÀòìÆ&¹™2‘¦˜¡bä:q\•@@]1”êé¤ÔÖæÝaõÝÏT^þr²sŽá-’_¤9õª(|·¿pWÿYÇØØ<@î:¦¢dË¥F0(9ÛY4½Ö0øÔë®ä/ÿØÎo|KQõ¾Y&KÀ) ª‹åckÓÒEk=^ÚîÒ©+†Ñ·Õ\d(›:¥bZˆƒ~aæøw½‹xà üÿú'I>T’Îq\‹OO=¥‰·yªV“£fUö½œsh">€ÞÞ¾·«².^u ÏÜ—ƒ0s\–ÒA ϲÚíièø402'/:o,Zš;EJ&¿yQ-¥=ݱifsb¿SJ¹ÍJCD<‹þÇÒy¿b><•Ú²ÙáÇþµg¾XíI*Eä+aDOdÉì¨ %eêI¹É%‡ ©) F°„:ÌBËñ¯û:~øçŠ·}}»±KBêì†ß¡(AK€ïkà >­Ktä 9Cÿñ«þH]é¶QLNgQºµt|•ϯ¹Ÿî>Hpå]. æ~Ý`¨…ÈRÔÀ#MÂa‘˯ãÏßþ8ú-ßÈ騴™&¡±¢Äâ!ašpk™ÌQ"ݨ™R»¦%¯ÖúNhZÔµUÆn¥þJ?ùµ¨xü•´r}å|f‰~7jzÕ 8¹¤¤ŽI‡ÌUŸõ§Ý•Ì‹,àHñyïuX-âÕQ'y-râ/ñúRÚØ 9cžH"ÊÔ"ÖÀ;%a#’ç‰Hàùø¦¿ù£Üô×~kÛ•÷ï«qïÎ sª$' µ¼Q¨iTóE´Úùå¾Ä^¿/ÑLª¼ÒH°µþw¨±ÿŸ½7³-+ê|¿kí}Næk.æI¦bP±œEi¤mµiŸŠ¶ïÑÎÚ­¢¶ ‚‚m;µ­ÒÝ<QlínÁmAA檨¢ª¨¹î˜yö^+âýkŸs2oÖ€Ô£îµê|>yoÞ̼çœÜ{­X¿øÅïçË1®é ¯ZÀ¤9<3|•m•µJ3Η0øž%ׂ'Å6ñØïþÞsè\Þùç¯$—“*"™º J*ÙÂgàci#Ÿ)wúŒx77i;§ÎÖf^[™ìŽxÂÄ©Va)¾¿¿›ï(J׃œY“ëáÕ߯µÏJ•Ro‡¦IžSk¯ÌR¢”‚{fHá¼²á c‘ÇÏ9Ä7<óéœýef+e6vݹ“árf YXÈ…Ee‚¤P;™ŒÆ0DêÊ;£†œ»äµu× –U16“ÜÕ^}B1 JL Í$T­³·7˜¢"UTµ9¿E—U’"f$ïf<ìIOfó>÷á ¿ó<æÇŽ ^°Ùœ¡Œd3’*V*šºc‘Ÿ IDAT]atëM¦|dw €þãÊ^nE  Y ,—ÊòÜm=‹0ZY¶ð7rf¶¦ñµ;£ût½S‚]â^ÊVµ·®â{ëžÿØÇ ­#½x“oåJF-Œ¹°¯2gŸÍ“ÿÛ/PþtlTšŽß)ƒ]Ä ¼kÀÞpƘ—HÒ Ž¦œ-Ä¢ é­!`a ­ Ç7B0«}YcLÑT«Ñ/¡_Î#eb—ŒC|’…š½Û«'¸ïc¾”{ÜíîüÏ_üyº#סãqæšQJÃ^ÝJÀ@-ã´vÿ¥±äfÀ Œ™ÞéÞ­¹í9E±FŒ»%»_“•ÍA™3²›]¤ÍݪŸælewPÊÖ•cZ;1-p¤Jµ(MRJŸÔDÊ^Žï”QB¯—ŽR*îÆþ¤øàlÍ2{ßöÜ_†sÏ&M._k²ßr'í¸N4¥iJ“ Ü=|ªÄ ;~”ő뮿ž²uŒ­á8ÇÞÀ8lé}0¬†wìÃ2ßw˜þÀ!¶DØîY "œ}»cf¸æ¨VZƒmªÒ¹„{xxäº#5q „’æ1Ü< €Štäû=˜oxÚ³ù³çþ ~õeñ|&$Éô^(^Ù– 6ËZâ`»÷ÏTzãíuïØ”ï´Íðì¶d/âíäÚ "è@l„—§µF…{e–}J‘îßJYùéÜÈÒä§jÓ›®ƒª†Hg­Ð0o›Où5keŒ~Ò… (Nß)>ʾ=oøõ_dû¬Ã(ÚtÔŒEªÌè¸s?l ÿ¯Z‘…Õ±k®fûš+9rù%œ¼ñjdØB4,+V9P¡–mÊ6#ãXPf˜÷äqÁxãõl…bp:ã¸àƒãÀ¾ù>:Œ_xwο×=™_p.Ì6ˆFŸ,³Æ$0xAÅC,uM6Æxª”'w¹Ô0Ÿþ>÷æ_>ûçyÉs£ïû™ea{áÔ”ÑTÑ*¡Ð×Ö䤚òVÜ¥‡w{gGè½ôcU_©cO_ó¦æjîÌ5±‘ú¥ŠÊ<|mŒìÓŠyO¥³¬$魽ߤ‘I ãÀ¬‹æ€5‹®­|Šó¨ÞwlTSŠ:[ZÙL‰:ŒœÜ˜q·Ç=†'<í©pø0J†ª3ÓSÒë;[y+h+¬0½›>~ G/¿„rô¤ ¨×¸o]«Й=ôÝ{`h‚µ‰J¦TÅó&£Î<#ÙȰ½E®Bò;¾Í57\Ž_ún>þ”ž³ÏåÀ½ïÍ…=ŒÍûÜRU™é q¿*Tô-°‰Ï0+ P$¹Ø ܰ$Ø9çðħ>‡—üôO2|ô}œ¬u>C­’¶W àU|éû²ªÜä´Ý8­ž­en;<-ö(MVÓ«ªWq Ú‹4Ùùæ&j xrj]Û¨wȦm oΙ¾Ëœwþù|üòSj8Ýë¶x{”´Œ±éF…šÑè ³ÌCÿå<ú'ŸÁbÖ£Ýä'¡ÑëèirëÉÚ’¢©»Uá3!ØYkÜ£# Œ‚°IMË!¾Þ“C_ØWw7^ÏMx'ÇÞˆ—‚Ùã%Q­ )“¤`n$+)¤*Þ×6¯Z£[j=YºF *ô=H® 3Ä%ð?+¸öxI ž·H²ÍX zOß'ʰEÎ ?±Ío{GÞüj?ãÜÏü\οø‹8û3Œ'p&][ Ž»‘Å)& ©éRŽ$`d†ÚÏ×>ó¼ìgžÉðá÷2…A—‚'AK ZFuRÍ£Kì!ìº^‰Õ@:.ºó5-n £ÛѬX¥«€)¶C‘a¹ =~9‘0/î%1Ï=æN^3ë¹£]u9n¿µ UáúÍ_óœ§S?ûœ@ùÒ÷<âáñÒ_ø%ôêk9€2”m9D8+)Q=‘«3ato’ô5’YsTaL†ÖæhR³Û+VC£›ñ°¯ü ¾à©?Â0 |®o˜¢k^…Ëir‚3[âIÓ¤’œ˜¹2ó6$š›HDÍô$íA9yå'8r饨±£¨)©Ný¥f:•«„‘¸)*]S)—1JHqºä˜)•Dˆ«ƒ» ––#[¢±øE5šT ÁP³Äéç [ÌD¨nŒÙƒüœãöq®|Ók¸üï^Ëìœóxèç=êÑÔÇIH'ICÀ(Þ˜µ,­]¬}|Ñ¿øþôW…CZH‹qåÔ*ßÕ°ðÓLeãôx·1ðÆHŸÊ[w§jüÙ…‚cºSžÚÛ¨S—•yKÂåŒìi@ Ê‚Sm$Í2'‡~ÍWrŸ¯þ* ¡¼ŸýgdûäQn¸ú£œüÄÔ£7ÁbDÄp+hž¬”×|‚·½ä÷™¿â¥ÜÿÁåü¯ÿfçœKÅ[ç–]Ζ…ÉoØøû¿zû)…!wt5Ì­yÈ5ÀiS„mcºQprR6sY £UTs3á¹cÿ‚²Y —ıÎè.z(ùÁï‡.¯nÐd©qøÿõÿÄßÿöóyçóÿˆ{¹nÌŠ²aP‡ÊÐu ɃfR#¨ BrA<‘¼?%¡ÊÈ,) sòÀ·þòÏR6ÓéK¤s1æ§«{%-«ü'Ñuã m–á¸ÔfÿXP„ºu‚k/¹ŒzãMìw§ Šæ}XYH‰dˆŒU  &‰´™·OíÃFÜ„Z-ˆ¾dÔjL˨a–ÐTÁ‚œ§ža„G­Âf ;D š2×7rŸG\ ¹ç|q¤¥ã‚ãW^ΑK?ÈM~×^ò~ò0àV™uBµÊ¸uï{ë«yûß¿ƒ»?êÜï‹ÃÙþLYÃö/ Š¶cÍ®½Š«>ò>Α¶8 …TW0ÒŽÌyò«½«iÁ)Æ>‰Ëbk3y"4€ÕwÒXÖTO’À¼Ët*H5H«ñ¬„ÜáÛvkÞÑ_Ћ…çò­?û3,Î?;Ž×P¹˜JH…Òõ\ü½ßɃ?ósøƒŸü^}5ŽsB Ú)x¡¯Ò¤‚$² Ó&íîa&5ær‹q`q’kºÌâ^÷á)¿ù«px?i3Í)³Í_ê”ÕM(à?ÅâÆY«^ÉšÂmòˆ­ÆÑ+.cëúë‘q$%ÁL¨¹ÃÍ©šÙçd5,uT騨wˆ»ßýBœs×\ñ1>ñá÷Ó%Œ‰ÔœL¢ÖÃ(Œ(’IxŸHjÙ¦4Ü:pl—„ªPÕPÍTÏsdƒn Íù¬W6ï_úûߟ ÷xVG®|Ý«yËËþˆu› ÌF‡²Å±7ÿoyÓØ÷Їñ°¯ù—œõÐGRX‰;t,¶xýË^J6X¨âÙÙ;åðÂötÝÀÛ×&DÌïâáÝ|Þ+«RVö”K3ž–ͨ†'­Q–eïL›©G=$Ûk-Hîq³f xÇ>öm ½rõ¼ç›ŸòÃÈù÷$¥.ÚB®  “Ð%Ë’Ágxôçñÿïßå-ß÷ã|ðïbÆBÒ0.÷jt"¸*E '¿F™SpRš9qÞY|÷/ÿœµ­$G~“µÄè”ÕÕÀL­Mœá1¯II`l6& °£[¹â †­£xóyP\ÓC#è-”îàYœ{Áù8÷|Ø·Ó@äθú£%Ù@VE¨˜Ñd–RS“iª#8ÕR`ŠRWT'a²Èò’náòçš2³šÁ O™mBMº—è°v¥±ÎFN¨ÛÌ{N.Œy5Nª9'Þ÷þö]ïá_ð<ü¾ο7óAà†y×^Ãþ²3Ãö×Ј”=öæéXœ~ÏWºß7Gk°5%bm®f!ÚZã’¨jd6ºÜº”a0"høÍXú}:›¥pÃ|ƒ‹ÿUœûÏ;áÄt©Ì#úiÑth_Q‰+xìoý'üö‹yÛoÿw/íàd)3%»Ð#¹P)füRÄ(ê¼ÿðþïÿWäÁÄSn¼Ôȧ±¦©©»Òi@ôŒÔö{$‡Îúëú~„ícGéSF’àÚ1£ÃÆ1$’¬Ò{朳Ϧ¿ç=ÐCû›XlxH61ú}gq`ó,|{D}D’ ^G4ÜŠ‘ÃtÛ&[ÒÔBÔšê“¶ñ44E˜TOXê@òãVµ¡"IÅÀêx‚”B¸VÅÁ û¤àªÌIˆ$ŽÛHêŒÞðzþúuoáî}xÒ7ÃÁMÞýwËáZé¨,²²]až;ªGÖ׌|&üS„[ zzW—ö”àÖÒã˜@Ø9}¡"1S ˜*ÉVmÚð6f¹GÇ‚æhjˆ*˜‘Rf0oªwà†ëGæ|0û‘Ë0OdœÔüI]¥CÖü Ulwàx×ó¨ïz2=äáü÷ŸùEäúÉŘymÛ F £ùU$ÞJ\çëêYÈÃÒ$Õl9ó©Òïèx³,a׿A9óõŠûÁ{a#_~¿÷ï~„ñ²K¹ÿ£Žûùºßƒéò¾Pg’„e§hÇÙw¿'ó»Ý odlÇéD°Úóvpl:ÄÉGÙ 'åD6‹F†Š7cZ ?^÷ð¦X×…ˆQØÉõd¨µ¬N G®¾"pˤ)á–@‡CÇX™é…>ÔQ:¥ŒF-ŠæžÊˆ÷12Ê¡CÕé¤ðÑ7þ%x÷ßñø¯zý³Wp ÀB2¦Ž[ ._Õhî¨l?½âgVÀó H,ã˜j“r·˜Ž0k®L²œ»u›ä¥—šJˆ’šµ;Ýàœ{à@,®äKób …+YºGûŠIÝ#øB›wŒán Þ%Æl”:’4ó}‡xúÓ~ æ=½‡nŸëÚðõ$òÓp´*S…ܬýcfèý²ÏçÉ|>¯xêä†7¿•T+[u+ÈžH]ÔYhbH3¾þIOâþ_ó„Sš@§|*{öŠN‹`·;(GyUZšc`æy …*Ö»€'¶{e>ŽþÕ«xþ³‚þøfÕùà_þ ~Í›9çAà¾_ð9Üó³NþÙÔÁÈÖsüº9xöùH¯íаŠ&iâê€d^p×]{9âN2nŠåDñ1Â¥‡€aÑÁÍŠy ù ©‘õ­+ùtqð›ôÌjáÈ»ÞIea¥eTÂ0 ë³¹ø‰OŒ,°e)S`‹9ï0·ÖmÞ‘Ö´å9ôæˆ 5eJW¸è‹Í[ÿé…… !½Ø–gû8çAæñ?ôClw3æg|—Õš ¤®áŒQNº(Cel"M Å££†SxýSŸÍë^ñJ6†BñB?ëðZØ$…,ÂL©Ž|ô£½ôR.yÕk9ôÀpÑW<Žs63ûöù¨J uÅA›ü”8xþ…ÿØG˜W§Ï=ÛÀ+‘ª7* P3.vˆÒ3ëfl{d´"ˆ¶j†bìO=ÕFL•*º©RÆ:"Œ¤œ·R7C´c(Ûˆy[w•…‡§Eœ×Ô¯¾´Ç†—/UŽÖ8¯Á “•Öz°k‰Ê]®e·„ݵ2v¯²sG}ÒÏ7k|3gc¶A'1\O ¨ÿ¹'ÈÔDÑ©iÒ²3mÙY¯F¶Ø‹”ÙºÛa󬧀d¼.Л Tp®Ò:f¶VZ®—p]œ`Ç 7åEÏøIömlጒjenÊ¢ë¸æ¼Ã<õ7~d~k³ag£]çv V×F¦¢¶1ì,‚ äöý­mþäç–+þôs–6êlrNz¡¦(Ûu\Úλ«9~‚›Þý^þú½ïçCþ×ü«?ü_äyb’ö ñ‚hXTŠÀ¡ ÏçäUW c ›)c ^_ËJÌ1åÖP•DÎ_œÊ2ž Jb›È2A©ÛÉ`ŠYARû@òÚá:’û„—EÇMxª˜ùÒ¼gÒbœÈדždlCoKM–•ÕThØš óºS ¬«8Ÿ°ÞiÝj³:ø»¾î¾ p³n3ú”ØÌ_Z(Öµ?§GZâ=Ÿòô¦Ðâ«ÏÕ!›ÐUAÇJ¶†SæÄ˜…a3ñ…_ÿ¸ÏËnÚ”š¸ØR•v·Bs7X?‰½2NRÔÿùŒg²ÿÚkétd{33¨Ð-„\;ŽÏæüÀóþ+‹ Ïc+ûR1挄q*F“5—Èü2Ö`ûÔh4°ìèM<ï[¿ïЩ2ÖÂ6…Ò+cë:ö®ôÞEy,‹®`îN?6··¹þ=ïáíõ0Œ ³UœŒH¿TÕÆaßYçc’©%%¬²T¿¡IIʨF •†4–µº\ë¤FJȸ&ÒþŽš ÕÆÕ ˜H<JO"IB=ÅÚL›¤d¤.‘j4ÈD$JiUDš~ݤØ!+i#tÓkíU¶êiXΞöo=Ø9{L_4ý¸˜U’Ãþ®'á$ ëU`K¬.ºÔSÂà?6(OÁœª¾8HTzÉÈht¢kM“í·þÏ—ñ¡ç½ˆ®š¥‹E'p݉j l¾z÷²#Ím£uuäÍ¿÷{|ìïßDW·Q©ø8ÐYFúM®ë;žôŒ§²ñiæD•ñŸF°“•gqšŽ±èÆ{d$%ÇRŸ_{”çÿ›ïg|ÏûI,–;`#õ°(ÌRGa(mø-БB˜3wŒ*hJˆ;ñ¼_…aRçµÁ%-ÃT‰xôÚkñ¤hß‘D9 =:Žd âŸ7ç/  ”W¥ßZ:{¡®mÝ„ÖDöŽ>͘çQAº)A¯” ©Kè<Á,3Öõçˆ'$ËÒm,>|EdižßÛy@/Q–Î[æçm_®ãywaxÿÈG]b|²–­I„yîé“"VØÙÛhäȵNÞ¬Ò§˜f‹¯Šåªu¹ñ¤eƒR×/-¬ÄŒC)á×ÜÄ?üÖðÚw¼oû¡¤{ÈC „É'tò&Öº.7’O8¤ƒ*ýbï{¯}Þ 8Ëšf¸ ”ÀE-)ž ^ý¬gsÅÿz)g‰³Õ)Ò © hI«õ"¶šëÿ-–àdj½¼\R© çŸ4þöÕÉãOþ7¾ï^ôŒŸ¦»ärΖIضû?t=oþÀÑßû0ç>â>\ô…¦;|!cêÑq†j8Ú a™ÓŒ¡VT÷,=b=¥‚æó·“3Ù»àŠWÇ4‘¬FдŒ»QS‡Y”ª]#PžB¡E¨¨+UCà=¼„QÃÜB;¯e{I´©V‚\\Ä÷è6{HË»EY+ê!‘µ¬Ã‚rðtq¸ê.ÞîÓ»AcAÏSuñ²C—æÐñÚ•í•…í•=}J0’;CÛ(Kì¥À^ )¶æâT[˜7 ápéØJ™ª†\þþ×w~;Ÿ÷-ßÊÅßñ½”s³aÙ\ˆܵL¯¨_÷Þú’—sh¬Œ)$mÓv¡×Ì1U¾åi?Í‘ ©ä(e§;Ã݄¥/±NFÌÍ™êaS#e‹7þúóxÛË_Á!”âqGjeî‰mÙ9¾¨“‡1·‚AµŸ9ÑgοiÁïþó'sôÚëè‡Â9G†h…í:svå \}Ù5\ý7ïæÂ‹.âŸõpÎzä}IšZTuèŒâ[XJQ<`QQèÄH6|¤"Tõ "X‚ä ó&ý` =)ˆÌI*.ЍR5‘ZÐó¤$ϘKb‹ ðiÊ:a@ß0:­aºjǶ ‹[ØÌø©8ü]ïÔàdmza•؇EBè6R¢Ó„´ÀPYÓä’•’òzF'¾;?øTÒ¼(ƒ¼Í?Zë°Š9³†“¹¢ÝªI,ª}tq’4Ë+ÌÔ9לwýþ‹xÏë^ËŸù,\|1%å¸Q¶IR‚­ã'yéOÿgo $7bh)¤.s¤:ù¦'qÁ?ûR¶s"cdiDÊr g(‚§¥øLc$)Ì‹qÉK^Êk~û·8T*U25%Ô ]Ùß+žônᱰʾ¬ŒŸ¸œ\ ÚÏ1K wCÄâ=JG5Çû ÊP¸âïäÊ·¿Ùý.än=û}î£èöÀ¥Ã%QÅäH=IvÅ¥£HbP¥óêÆl,Ô¦^¬ÒÔ34G JÑIÇ„hFR Æì«·çÖ˜ÃCÅ@rh>‹ìiUX2áóüÙIªjUé “Y¸´*$굨Êî`IÓ*àÉ2üHëk6Œ¶FÇsó€ó”˜i¡f}ü†S]Ïv½zû¾y÷åIÓ‰GhïMškX;á$†ùAñ} ߘ©3Ò³§3cvÉ¥¼ð{¾‹}ý×ñ•OùQ8x¨*tj(¼îù/dëÊK©U° RfXœää|Æü‘çQ?ô;ºv I P²5ÕçI÷ìLnÒ6b¶›“':ˆ?ñä»ßÉŸþ—ÿÆÁa$§Äfdˆ‚j즱ƽi«Îè^‹5¾_:!'°¡àêT/ 9 Máe‘¼Y¨(f9`†ª±øðõ|ô²k¹ôÕoâ¾x0÷»øsHçßé6ð1ü‘•E*Ôq I"[ÜÇQg¬Óö«þ&IƒˆmJJ™ZCNÊÌ‘”Û8§5r{Æ—€’·@'Hiã¶‘"«©Avú7Oø¢Jœ4zóÛkº®rM±ßáË}/.ܒ汞¡­-ñFö¦‚G«Ç IDATe3ÏÈkÁµ]Ï™ö|½tûävê.E6+j kŽã5èÀûÄØA͘ž*ÔJ Éf‰Y©ÌŠPÓœýöWáº?ùS~ã _Í•ó7T`@`1²ýæ7óÖ?øT+Ö ¤Ž²½ ‘ä_ýøÓðÍP\IVw†ÖÑ\#;gü£’Q²Äh^QHµÂ5ŸàùOÿq¸îI2V+3wzw4wh—— ûäZ7Y_Ú'a)IKA ú61SÕ¨Y(µâcEj¢zèÎF8èڌᡫ æÕÐã .}ýÛyÕ¯ý6o}Ñ‹¸éoÁ] â,Á3Ü{<)Cª˜:ÙÆµ]‘“VƒÚâ’ð”¢Û›hFR&KFR‡æ.‚Ÿæ0¸Ò„KF4‡tüÄyAÓŠ¶âÉÃ5O¤ tì,ñOñ‡Ñµ}rÊãnwNµ”‰…-žäÔ½ñ’vä’ÌéT™§žYÒv·HË]5ÆeØY®A—_·WZ:ÉÍC(Hh[ YÙ˜màBè§m]f) )ʨЧ¯u‰ê•T :‚uƒ„±¨©5x–Sy)jó3^ Š¥Â˜ÛýüñÓŸ^rû]¨®ˆ†îÖìœs¹ê†ëÙ—:6¶O0¬S€v¯Ë6ipK™^+ÕÒu‘Á›ã¡ÈȼO¤±'›cIĨÉK”$l¶` 9Í u@åÚ\ÂUû ~Ó\ðˆ‹Xì;‹nÿùˆïC‡Lr‡>1H¼¿åz'‡L<Š{êBŒY{L5 6ÑV– µ&A%#nÓð¿5¥V[6wTB8Ь¶N  fT•åf; *Ø3Ãó¥¦Ùùµ¦¦@—:f}ZÃGÈÛFw ¤uŽX)1×Ù&´q™Jr´Œô)1”¤x*ôfdOˆÍ©µ"½sÙkÿ†ç}Ý[xÄ#> .¹œ¹RÉlx(Ë\7K\ð¥_ÂÝþùWC'tí÷5Í˱;wÊ ·9ÃC^¿¶’{1Þô‚ßåò7¿³[ÇþdNœHßõŒgpÞ—}1Ïþ–oƯ¾Ž³<-›M{IÝ–¹Ïš»t(…^…g4#§Œ¦Ž¥‡2·jBZ9X!yGêC­ˆÆÜx*‰ÁàÒ\Ây¼7) ”#Ÿ@†ò9èÁóë Ѿy.Oܼ²3UDCP£4Y­xŠR·6â´6N„ZŽ13Ÿäü5Ì£Š ,ËOmÚ ‚pæOZH ±†A ê‚ñïà¯^ðB²M\ÌŠ%ç+¿ûÛ9w;—ÇïwPúÌXl×Ù%{bxS¦·×G®1HZÔ8I¥à$ÍX©xVÆ™p²sNjÁUBþ«MRôIè’"c¡GïªâÒÓמ>z-Ç>q‚äú‚meì.åȉwqäÊ·ÑÝðaÌêŽìÓ^ÛÔ†j&5\O5JVÏÕXw*yMÕ$¡IQјØÐSUO¤uµ“h”¶k×MÒ4uáŸü>¿³dx©f,9UŒ"•ªÁ«cF-ºGâÊ$îÌzåà,¡Ã‰(a'h¯zS:µÓ ,SÐCÍKìÐW0¡ÈjŒP*¥5IL$®Zʤ”èæó ˜Ht]'µº.Õ˜‡!æ9Uƒ¦Õ¬·Ì4¨½;U”"õBïÍ Ÿ]-3åÝD“²!'8®3nìò½ÏøI8xÅ–W¡Šµ^ô$F0Á¢>;cÄv«_›5cÑDúëOòâû)îqãQJªlÍØÿœÇÿ .þÎïáX—)À~Ã7qé+þ†›ÞôV\G¼TRê1Qê°`_×cÃÍ¡©ëMFQÓ!*dŠŽmÎ~%Œº,…«¯²Š‰´Ûj]­hL£DƒÐ RC~¾ÆÏÖb˜³Ü±‡ÐçsGD)^š;ALŽ´׺ßv‡N›õÌúàýT¸ú®ìn vIas6£V#¥t›6Êú >mš ¤–jáf¶ÌzV߯ª„ÿƒgEf³}sf›û˜mÌÉóno0víkµÖ&à7“áÚ²¸âh§˜èR[ªÓ›Ók¦ÖÉ ï2#á-;ö=_ô_ÇÏ~ˆ“ÑØP!®›ŽõñÌÓèÔ½-÷oy@™5“q]®àM76Ç‘W½ð÷¸ö†kÀŒYóŽ‹ÆcŸóL˜g6€Mż'ýÄOrÕ<|Š»Ô‘Û4F×÷lÕc ùww‰YåCh#›@Q¿¨ãS»ÀZáÊ\ÆÖÑc¤Æ‹K)²2·©¯ªô©rrû£|üŠ×põ•od8y5 Ù7›#Ú#©Ç´Ç¥CSZ{2"S6ׄHig¦Ûd”UZ£¢™ ¥”I)·ÏS;UÜ­yqœž;<àU Ùq]º0†â±­õ ¥™ûg„†Å§»­nhNÕITÜKˆ¢KÅ’aIо#oÌè7f¤YçðË(úi;QnÛôÌR Ô¦Úì{¿ß‘9¬Æ‰¬J©+ÙoíC) >¢Y0ÝD.¼€Gדa#7ߎxå4Ðî²j²Èé‡'ßrc«]Ûi¨ÝÌ03¶¥Â0²ý†7òÚ¿], ïðÜQŸÃ÷=ï7YìÛÇ”ìFÛ)Ã}îÅ—~ßw£5$Ï a`r×µÃ1<$%{"Õv´ì6ureMJi÷‡È®ÃÇ×>:=9pé{>ø™kÃØ`>ß`£ï‚ë'ÕØ×+³›8qìÍ|âê¿äÆþžN·PzT ºiŒñ¡Ë¨'š…¤ðcGrÓèÓdˆ„/EˆéÀ¶Û[ŠzúîÍ8Yaf:—¼ãƒè"L€,ÇýÎ.àˆÎÚºmÀ4p5\ȤÀûl g£Ën7rüÄǸéØ%ÔáÆªFÊÄ¢™Ö—S&iŽÎm’V-Mºy!"ºxŠ-@j¶·4ÁrWÀ“µÎ¨…þÖTJt*ìëz¤I<ÊÕÛ^’­-4Q]¶é=µã^› ûZs!‚œ,3Iñà&E¬ ʃ©ž’¦{+e©Ž—ºw+|Ïï«ßGe”%¬N#8·–aÉ×÷ÊŸþÃtÏjåö*³„è`ÖZ—E­¬)'ïè\œ¦epž®¿È²$¥I÷cÆ[þós9Ø&Ye;g¶¥c_5~ç'~®»Ž&1…ê Lå¾9ǵãqßùpÎÙÜ”*C;à6Ò|y?’ćÐgweë뙞ý#¦5Öo‡º/5«©ªÜpÅ5Œ7œÀƨât$D •èŽ&fdæhÍÀ_!U¤/HªXL¿œ!N§…â7qbû:Žž¸Šaq‘B׃vÓRÔÆ¥ Ls¢¬¸¦hŠ¥5¡Pù¶ãvŸ~µ”Óä˜÷eF`º-sgÞÏÈÓô{õ“ó¾”õ,­]#›J£¢DÒUpñR@WÍš!ŒFZOdZ7ÇЯf§.øÝ*"I+lhGÛ´îèô&Iíº(Öõ<ô‹|Þ##‰PÚ¡¡ n%pÑ$;š»1²3’²”»_+´±<‡÷½û=¼ãoÿšÍqÁ\ƒ$ QOùð¥üÕ/ÿ(‰b!„*Í>p”Uc :›o{ÆrdÏ B_…´(Á"™Œ'åí$”œµl·mýí‰éíqð¨ï< ‹:’ƒ  [#ï{Û;˜÷³èàCtãuÊÊ ¥Ò§pʯ$ɸözFæXš£]S17º”¨~IÛô½‘ºB©'8±u„Rº.IWü¼sBo©êQEÄH9/÷ÛéèM{Ç<Ì&¸ø÷"U¶´ IÙpeÖNxÁè1¼TÆ${”²©If§vcòÊ híU³eö6ݘÿ×¥Ùý­])sCmrt²6ûÑ4ÀÚG²„5N;•ðui7&»¸Òy]JÕ#†H¥ª1$¥h”5=!6©Zñn¾öÇŸÅÉùáå\qfªàѾ}e­a±t¸™$.O€n­™BÃ=>ŸÍ Bmx+"¡zzò8ñóωƒË£™Q¥Ã¤'{æà¸Í?üÙKyÿ+ÿ„lcÓI´:]à ŠÂœÐ|;ë+ŸÀùŸó%,Ò&ºm¡Ùo&œð6q²9*NMºkå[ r»¿&ö‘Úáôˆ%²\Š dzæÛs®þÀ'غáX”–­¹9]Š`,Ô#”2™®‹#n¡Ú“c,¬h%é ‘àˆš ÝÜA·ä$ÛvÉŽ6¸gR@V7²Ä\¸ö“†3ËÂl–½* Ô9Ó¨7&Íß;gÓÂVœªÂd˜í÷dô³Ž”ôÞÛí½ì¾7S–˜ïì¼îÕ°¸­¬;ò5pWc ©ÍæVÕDV¡"ܘ3Oüþ›ó3~v¹}ÂõêŒú©Íý-±¸ä•Åâ½Á¤†úµÁ¬²£ ƒf6Jååÿù—ácWÂÂ]ÈrÙX©z“ˆª#³0:²g¬••uaáÑêMo6›ûdË÷uÊ’¨­ªŽé@gûØ ®¾ìJ²FW"’-åœ"Ö%—tÝ~@åôÄòs¤Y‚¬¤ |* 4pºÜu13«¡¹gŸW•¥†|=ѸI”ÜE¢Ñ©†V%`elØû2‡Íwº€·s÷—8]­iÝib–û·ø)Š ·%ež~Æö P7´–eîZ‰ª§¨‰]öø¥Œ+œõfÅdTñ®euYfgŒì—p:³2…*w»øs¹à O€®?óåÙY§ÉÄÆ©Ó²\fy+÷6·IF|äåÏ÷:)˜h3M2’’;UE›¥pøšëø½ÿTX Œ•]G‹ÓBjåý/þ.yýëé‹Qª0’‚‡¶Æ$Xk¼¸õÀf{àzë£j;1†6aË¡äÚ0â6ŸšŠñ±w}€~;ÍÐ'$Þåß©™É½®j²;·Ÿ‚^àØ îQÁ%<.4<¼,¤LÞìÈóí5…ªŠ)¡˜œâýšÆDGR¥ÔŠYNnÊ¡é44ñÂrçËðû¸jR”pÉœÞa#§%΂¶2î–i*ÛôöüÚ®€µW–wsAÏÖxXÓó©­×ÝAo¦…7@ØÖ^8Y]§ntÖÄPFNfå_þÛï‡ ¶%¤¶Ïô‡­jÚåb |±‰z®ó&1fTÞûÊ?çäŸ`cª#®™ªBQš!Mc :ô"\÷¡ð†ü•è°zȪÌÚÓn¿÷½¼ü¹ÿsNn“¼R6æ Ê=+“'%™ÍPUª·ÓöqÙá5D2ú I05¤SrŸ—Ú€]Ö0‘o8l4X¦ßrqçkZ,¹v’Z)8W)±™zÔ-ämÚÙ¿ÊÔ|’ è^UñõÛÕ×vgy+üON}Y99•ZÖ²·S»y»›•åÁäÔi ª1Š2Îç<æ‰ODð@Ó«õŒx²ö‰„šÑ¤2¾üþ€1LÐÖÈŸýú¯sÐ [9½lQòºtT™D° ƒ&¶\˜Uãÿüæorüïþ l'iøè‚Ùö‚ßýéŸãP5Ä+ )ŒV›Úºžb¨´”º¤¥ÜÒTÁ͉ìèF˺~ÏʆQ=¾ì¼®ÈÇf̺Ė:'Ï9—G=ùÿ%ð?ƒÅ¶­Yzð¶mà Ï €Û‘é0¬•+_þ fW^M®•c³8)²)EóBÔ×È» CØW„ ¶¶yñøi8v¬áÅ€>øÜßàÄ>Ä`ÆÉ^ñY&K%W /Q|m› ¹ér7Ã÷÷¶m©ÝëÐ×ÃÀRÙGq‹™q³Š™Ñ“¹êCg¼ásSÈðl2ñVYfy°RÙv»WЛÊÛ)ðMMŠºKªg:áo.ð=¶ÆÚÊ m³×¦SÊÀö,óøïù8çL‰R̼ Fžé ž.»±ˆ”U¡ëAÿQšîÝÖ6/{Áo³{ê29-±'C°6¦=ÕLFQ²VÒXX\u%üìg1_,˜/\ÿáó^ø6CxIÔí‘ìŽhaÄ©ª¡øÑFÜœت êŸzE&¶šÔÐæY`L8¸)*0Nê0¦ Ç·øØû?Ìl vƒ§àÀÉ$%9¨SË 4º°³”ÍPB½G£Ó*âx’S`jª@S€só(ƒSŒöåœC•JÁ¤àIé6æÌ÷opø¼³‘”¨eÄml8õÚgz§ xÚ¤ÕlIr„IÃ.Xó§pÈ>…q•[û?ëYÞ-á}»Oë,©1Ôw–7·u%€·ùY›~¿0aΩãÂûÞ—ÏxüãY¤Vˆ.£3üSHñÖ„jkR,eI[¶“›ô×ÇßøfŽ_ub†×¨ƒ‡Cç˜Æè`rPK”Ä8æu³GKåÒ×¼ŽkÿÇKàdá7ÿï€/è0fEÙW:öiOõ‘QÒ·!y_?duÙýt±›9Ìô”›¤œÈ8XWÏ›r¦ÖJN Râ—¾ÿ#øö#e"ë½Ø%&§+;·eóbÂïv| iLsÔUÁíÞü.$FÇ&>ÞTžŠ8x4%RŸ#i¦òìÈñã”Z‘ê*ffówHÔÞèSsJvL”d…®M3©…ýó-ÁSœAÛb²º~Wö X;—ÝÍ5‚§j]âo6aqÈ?Ûi CšŠkÝõz$JO)Ÿ÷\ç¾ô„¢32#VO’»9[%²Qa!3Žä ¾ç{~RBC´}IƒWÎ|ÅâГëB¦½-Ç4Íùjtq¥àoÿðO˜•Ž"‘JÖŠ'Oâ Ãþqiã¾&’ÎG#«°±ÍË~å—øò÷½‡ùÛ_Þõ$—å=QŸ7,u7c{­ô^Înû­æ+nçúÁ7Þµ&cÝiE¦×·Ú\ËcdÜøøì'Y|Þ¹&rc—›$jòàïä©•jÖ ‹à¦dà1V®+—2Ç‘Ú:· æQ §2³4rN«hL«H d#Q’öè"Qç€÷µF^þâ@,{L$Ä,êÊÕ›õ¡ß‚òȧöüfq¿½+zÞ*NwKªÂXbNv¤Kl8ÌÇŠhÇ¿ä Ù¸ø³ Å\¤Ü0ÇÉ~æ3ñ2iÙ õ IƒðÆ÷ñ+ùØ?¼ƒ®V4)£¤å¬²¯yï !¸Ó5eÍN‹“Û¼ü%Š–OOÓ綯ÓUÓb:p]§³=ÂbÖLÅJáƒïz/h³Ý©e—».<‘×2¾½X4Sƒc›·Nc™JÛ›Ã̧ŸUmЄ8)%¤ã0°ØÞ¦4þÝ©Øù°¤Ý ˈt†2.)ÙN1Ú¾=JX».ÞîÆ-hs;E¨òÿcïÍ£%»®ó¾ßÞçܪ÷º @ ‘ ¤H‘"(‘â$ÊšeI–d9”‡D+±•d­(+‘½dk­(–9–l9N"eIrd;Šck°d‰v<É5Ä‚Hp@  èá½Wuï9{çsî­[õêM PºûbÕjtu¿êª[çì³÷·¿ý}GHqi& ÉŠBöDÀÐ g‚ó ñûðâI*¦D„DJ›üÕwBÅ<¼ȇퟜ÷³¿À;;œ@˜e#‰Ðì%49šE¶¡Û.4*HÊL\ˆÇäù‰š'ÌSµòóN »NRé ?üéÏpæÑ§Š®NuÆVÊH™PÄ&¤`u}9ëÕ÷bÜÖÍÝô]ݵåp•y‚]AQ¢ÅôG”ÙÙr.2:L† …ŽÀ™ 7à-Ê„Zêx¦5#UuÙ~lGÇy&‹jAzê_RÇR?¾w×v?ŒbHŽ»¢“bGÓˆ‘ÄÙ9>á½î{áºëhûħŽ^Äjs~ŒZ0pì[`wu´L Ä'?ðN挵³‚M¦E€ei~|ë-|´€ãt©d‡˜¡îXÊ#2ñ9§o‡R7¯EYpk=ä‚ÁTò¬åÜÍ´Ž¦‘(FöÒÌ@{i2YÊÈÖej}tñÑ$F°¨Ãó^”„dPN©2øqR’3?½5ØFö*ÈE…Èks^ÀÓ‘’‰C@ÊèJuJ6ö™­s‹~@Ð9rÐëW™ìV%¶5ܽuÙÝAÍ=ßD”䙬ÊÄœi‚.ž¾âR^õ­ß 1{§¦ƒ¡G»ä< vµD—%%`LHÜûûÀ¶Î€µ„F‹xD¶Ú‡íÕ`|9ðõ/]JdšÍi1ÑQEb,~­,»g-ø­>·f ,CuÏ2siŽà“Bá*¸Ü£Ÿø4vz§PRPBœàaÉÆˆT,ƒôYÿoˆ.&+t’ö RVFåj‘ƒ¢¤–Ô¥"váNöQ¶]8xò x»‚ÐB / t¹#k̵3çb´¸—`ã8ø An/ŠuÏÒÃ`5ðeÉŒ Õ2B&¼åÛ¾.¿²È`UÒí¶[ñQp-D²óÀH»'µ2[²4m1˜µüÇ÷¿Ÿh-)R( atÈŒ+{Y%—ãÄIƒ ´)a” Ã{ÀºMñÇ”õõë|]'·'([åuz5Àé›gÞ{H;œÎû?z7i§C5TòuÄj–'ÔùÚ ƒ³^ÏÁ[šÈ¾”åù¸Äßzˆ&ˆVúòws×1ÛÙ!P ¡*n`ðàäÇðÆDN-_h—m1³êË ÁT¾hAÏ«ÇÆ8€­–®²V·ŸŸÁÇ1£©&Ù9ÀöFÃ×~ן‚K/-IœÞ•bÞ¬xç™X- IDATÔì7Ÿ] Oƒ*Jÿýæëpçßù޵30ǵ€òR,[ÒàUR6óîÀç9TÉ)•Œ)årÏU‰‡˜…}ÖƒÞ®µ¼G\b¡ÒÔ’¦(\/²ÑâÐñL91éేáÉÇž({¦’„%†%œ»f«ˆÃ40V1—•e¤väVÌ¿wvvd#ˆ¡p+1¯Èl¿i):RÖPÁê"`(”E~¶svˆdU¢UŒÃ’ŽwþÈÒ#v ¹n« È= ÛgV3‘`ýìa..gÒÃÑ%|eXÔë&;´>ÄëoÐ6±™á×ßÄ‹¾î 8ÓŠa¦ä0%õò;Õw6œ]‹^CÎ}ðªõäüÇÿ÷ßprž9žͽ¢”Ò†Ý ,«åŸ*½¥ä¢f‚ýóY¤ÕúüáiÉ„Æs×Á:qP=Œ‘"YÑ…hÅÖªh¬K ´Ò° Y /ü+ê„„HŰkðŒ*dÍdIàÊfÚ`û‰“¢ê-H‹I™Z‰.L]kÓâñö x‡À8Ì29uªÞþ³UÞj  L²#]*Ãá½t{ÊDó¢?f…^VÁ’Læ6öû¿OÌՃ… L4@6<*æQa¸>@‰¹Ë{ÖMgžå×Ë¢4æèÙ–?qŠÒZ.RìRglE‡2YkÛû»ôJÈEm»40$øR@S‘]kMF´TêKD8{úL™ìé@êó¨¹ö¼Êð|å7â•#§B—;ÚÔâȵÓúløªÎsG˜LH–°.ÑQ)8 ]"š³‘dÄÞr±ªIL̇Ô~\Ú®-s÷Ø\ÑŒ#g7¦¼ë»¾ B1œiz0K”Þ\²ïh_ÚyïŒâ¿̪áN(¢ ³Äÿü7h*ɸUÅDɖʘ•8#«Mƽ‚Þ‘M¡Go¿lïœ:ºGèâô¾Í`ÎfîùÐG±y&6´·'"ýîÚ+÷¿/™\ÑLX`wE!¥¸¿õÁð|XnfôŠ**Jpðy¢ÝÚa›áò%Lõ¹_¶ú|Zøû-g–r㫳‰ÏÂi¹”h¹*_²ÎzǼæ“P'ʰºˆ‘"´]ØŽÕMhâKeî¾A8aÂ<æ/º’ë¿ö½ ‘I?°ØÕ‰­lÁ qˆC®‡Ì @—á‘G9sïl¨ÒBѯ²;9F<;›­ïYêÓ=j ¹_sãÓYÎ%ðiD= Éxú³óøCŸ£±â—Bìi(E=¥Ê÷Ü»0HHõßÃR×VKÐ[*mÇܽìrU>ˆDf[[x·ÐØÆÝ%ìj–?Ú¸°»´Ö“Pw©nù¤YJ´fT›¦%ÍsÞp) vNmDwY1ŒKù ÃÛ¯ñ0èÀz!P:άUí´gçÎåPºtÁ#Š2áÊ›_Ž5›Ó.2íŠaKpeÃ…¦~¡yl.´2RÖ>sÛwáÎ&ÂÆõ×óÒw¼“6(YA~±‘«ÃÚÊ œ)ž>bïðô£p¼sš.ÑOM…Ë_u3©©®p˜-ÝÍKÔ‘þܹ6!ø¾øÞøÐT)ë·5˜hä³wÝÏü‰3L<Ôê%«˜ˆ–7 VËAa4'+ >£Ê²ƒ´Û3º®ä—´v‹Ÿo×ó~Çh=1D ï®íJ­nÏ HA Bçì¡}åõ¼÷ÿßõ ?Î ßúNNO‹…ˆ’c¤®ú×[3R¶ÂÍsYþ,«£DOEá¾ç» êrìϽfe.érö*öõB¿tÀ3¼7+ƒÿö—+wŒËZa>‰\ó5·ó?ýãœ|ÕËÉfl&a²nùÊú,{?!Ö#c{ûÂ?® 7¼w„6ç»s‡Ä=úd£AG⟡–©2x0ÇêtÖëæú ç+]ÛA.žå‘³­-ÄŒœ­dyÏ„p~<é' ÝÛêÙÀËœ©ª#9ÓH áÉvŽÇÝÞxlLi,Þ êHliƒð†w#Ä+·¼‘·ÿ?ÌŸý•ÿ‹/ý‹­Ë.%„@#†‹ažˆ^Œº•€¸bi!¯Þo¯þ ÷Œd'ôæÛA˜]ùR®yóWAÕ£qÓ…:±ð¥¼÷Ã5²¼ð»½—.Þ ÀøÜ½ŸdûìStMGŠeM|ùíï„«nà;~ú§I_~+g6”ÍÙœ,Ä«p–.©lf+ŒE¯£hBG„¤¤“C76úé qg©’ñ÷Öqøì‹¼áCNä t"lÚ„cÛÊç>õ0ÛÙ™M”&*'’–½£Ê,F,6Ä0¥SÅ«$lc–&8ö+iŸqÐ;B(Ó'#'m™u<ø¡Op¬U”þQ6ÚÄñl‰Üü†/ƒIA{·Úâ“ê ËWqõüé¿÷“èk_Ãv3e*ºÐDqrŒÅ1KŠç\ô„˜<,чÖ¿½ßÁ2í²gà{V~ýc¤ B,n€§wøô]÷2µ¢”ú{PµôT‹é»WYÕ¸bà-K™]ç5¢ ÊÎö6©í c¥ú*¯ÅR€¼8K»Ë;Ä:ˆ£ñÞ%©Ë™ìyw8„Vž84ɘç•oûJvB ,ä’Þ‰HÒæD/'V_±{®3 ¡£lÄÏßÿ0 ˜+9(É ¶Ñ6‘«_y3'_ûšJBɸdýëë¿–㛭Yì/øx2 Âxüc§ÛÞ.³²Y0Q^uëme–ºN„Q)ç ›-´([×\Í÷þ½Ÿâ²W¼‚Y·Ã‰€§Y‘s’^\°â‘÷_÷góƱqN›¸6·´ÇçÌ«F¬ò©|o»á ÐjòÓwv¥šÀ»,”‘•¶}–gfˆÕŽ­*fÆÖÙ³¨)’{ÁU]d›¶åÂÅ€WJJU.á¸öåD1q²:]ý;}pƒÓ)c®x.b.ñLðŒ{"i&ÕnœVÛÇÎÒ°¨Ÿœçµ·¿Nl Âñ&¡ªxXQ,ñIÁ~ ŒsÕÀ’)Z¤Oá?ÿ}ü.bî/a-jÉb¶â1nÿÆo¯™$( B3ÀûlO5‘ºdäüòÄbñ¤mûïü0Mž¼Ãƒ°6¹þ«ÞÅ\K1,õ2çõû™€8†ÃÉ“ü©¿ú×8}ÝKyҦİI¦ &ÎF*Ê"Pp¼TÕYÆubá{²‡5ä*»`õ5Udi÷\®*R÷Š;I!IÅ;óÀ#ì|ú6]É’I”i™`ºQtõ4ÔÎk5ýQÁbÄ5ÔÌ:ƒà!‘¢“UÐNЧ SÃašAzSÍf.=Ùk@,“ýÑýŽ ÝµìèWœSÝ«õ€›!ªU%¸B÷*É ãfl5 ¯ÿÊ·DG7¥¢7NWyq¢=p¨LÄ”ùÔX)Çc$äŒZ&ðKó¢w¼ B ¹Ð/WÎ!wðû/ò]e`¾|‹I¥šU½Á£œ8çøÖnøUO‹ƒ  w—ævB´¥º‰îýÈ'ÑŒ'ÇµŠ€âÅ"²=©Ö޽ˆª A‹jrPÔ…Æ#ÛOŸ.g> J‘ª`ºzã{³®!i¸CgÞQ1 ¨( ãlÛUž°¸úCˆ6ÅõË W…c¼ñï¬?Sœû…­#ûÄaÆw-ÿm)JrÏwSBk¹4S:Wv67yÍ;ÞR2‹p^Üýg~m×;úÀ'î.²[f˜åB<ÐEiΉǞàþÛäù¯ˆÞ‘¬+Í"÷žÂXîçg?Çé'Ÿå‹Àâ*¤ðª€€w„†‘¬Éx8¬8é|mW³»^ÔÀE‹‹Y2æ<Å£÷<ÈT'H,èqТ ²P3ƒ‚PdáµN_¸ H‰n»-£{ZÏ^QËôùWÄœ[®Ãiƒp&ÍH#EÕ`Åë`Tusd„­èÜü¦/Ã6§…tY„ë‚.Š%ÚÖ ¬+Y_% KÅ•º>ÍÎc•M[-¥Í¥¬}ѵ\ý–·@Œ+fß®á‚xýÍC÷ÝK“‹ú†kZH‰Æ3± D{ŒßøÑã3¿ükÄ ­jñ`¨Y69sÿÿm[¢MlÐÞmn ·— À¡à!ÈÊûfz‡ý{¾1lÓ7,‚•ÏlRDUƒ޵pïÁÛDÖ¢'8q%HÄe¼Dã0½$•â’űBTá쩳 uÝ3°Kçe9{^<“RN&…Ö™uE©Äœ@ɤfw)ecŸ]»ÛÞ~;ªqᦧ=ßÍ—´¾†cÔ×ñáŠÁ‰¸ñáßù´‰IÓÐՑ͈à&¼é«¿šª[rwÄã8Àé³l?úhÅÔ Da¹R|Ä8c‰.Ç®ÝÞáý?ñw¸ï7ÿ«øß0²®Üÿ¡s"9ÑΊ{V¤x‡/]Í…I.j){ám«Aì°øÞa°=ÙÇÆsÏ@qÐk÷¿ºª„•W8gÒDb>ð¶ž>[JÏXŒÉEžh(²ì=ìƒÐÄX$д”¸[Û[(1_úð²Küv÷ûÅ€G±]t­ÄÉz“ŽH¨¿Ê`裕߇‰8¡C$gfsZZ”¬ ²0/´@Û–KRæ÷þɯò±ßüWÈSOC¶²(]=©ÚsXép5²h9élÔþN#Àoq)%•8;™pÛ{¾B¨f< Ô‹ù­ñøŸAR&™Cœ0·ÞÐIÈ9“r[Éä%+’ÎØÔÈ4ýóÉ¿ÿë?N|òI¾óCÕDBB iÌl¤®™šÊï™™×­IÙ­Ü£çàS±ôoì!Õ¿ÇU1Œ1ýF€F«Fš2é©-¹ë~6=0¯]ÕPÍD*jÝKE!h …¯—…­3gQU‚¼O÷Ö…¿Wd_ ò‘?vL'¾àAï:6f^\Å0ë2]ÊD- t«ùŸÅÜHfD‰4(M€™AŠŽo'=úü_ÿ.ü™ÿnÿ nzï{yñí_EÖ@°’FŠ*¢ý8»÷wiÌІYis _v×¾ãÝ ‘2ËÄG¶‚kÄ =ॎ3_øBqÝʆ†€t]QQqC£€\³LP%»‘»Ž›s׿ø ¾pÿ½\º¹Aèæ´M™®(¢…ŒÞ†*ä% 1 K® Çúlª7? Rí€Ã÷%¨¦_§¾=ÅkWÅpéóm3‹"Z%é•rÏ‚Ž›sÏáÆ7ÞIEóQXp¨®p.Vê‡ÎžzR-•UH]7àܪR«>À¹/QT\Ÿ?ðÍó~¿¹û¡+wEÄèδ“ÍcXu te@ºîÙp‰¸f6šÀÔ…yNxœbžyð·?Àÿó»pÙåÜüÎwòÊ÷~-—|É« ›Ýw#(ØÃŸæôãŸçò³”h6ã„m3^õַ¤)ÂZJ)«“ÞºŒû^ Wæûîáê\J¥v–˜nl=• 癜6E Ú3¡‰´ž™×9åcÙ¹÷>¶ÛŽc¢d5Úœi\+F“qæSAáÜUg=QQ«‹#Ñ!èíÕ¼X ®¢µ„->%  vAìg†!vÆ<Ì>B|ÕuC³Â«í©Ê U@„àÆö©­Âx€AÛFDÈU²«È¸Q}jû·f{¶åœôœPÏ S„¾sõ¢[w&wìPè!MòâKZb`ËôƱc̽%A=±‘Œq“©l"Oœâ3ÿì×yÿ÷ÿ%þÅ÷÷üòÿƒž>CðÈ KA# œîf$²A£b•‚—pËL&“õ±Cžäâ d%r&›qù /Ao¼ið¬í¬:œk+¨ÆùxUeÁ•{XÖ¿ÿüCŸ£mçLB`z_[ʦåLH}ÿ’Òdú(ŸàÁ¨zþh(¦?I!NžzâI´Ë4Ùè¼TOm…>'u¼lé=ë 4ÄÅ!øg|/ø€ç£´~õJªœÉs¶­²>÷0h†E ™DǰjÞã ײ±Ûüè1¶M õäL"Ep4RÓðºw½6Š#P¨Ðã—Âv¼çoÜ“]‚š}óÒf§Oq,D$/jb3)8ÝÊwj2V®ÑÚú9\ÐÛ+ðiÏÓ•à·&H9ðí—A®+U÷|G¾V2U¯JÈãÞsïúí? é¦ Ê Jj;æ§Î²a01R(åoÉØÞ·ŽåàWq³¸9+_å½Þ9|»#%[*M  ÂÓ³yá¥ÌLsc:-k(CÎA¢§ï H6çÒÍMÃÓw†îñ3x0©Ý"<ù…'Qs&qaâcýh§î®Šú{'•XoZ~ß4ýHhuX[5l¹ðž)vTfo]@$2ˉœJë½ÿ[î„ÍÉ.Pù …¹>è•U`6™pÕK_ ×\SÄCÇï©¿å¶0]9_2ì}ÿ|Ô¹s÷…%e—˜†ÀFÓÍ0Ï…ðZL±FjÒëÕ7Ìð•])'û Y6åÙÞ^PÉTŠõøØŽƒØ.Óøgø5Gt”á?“xàƒ'x‘‡²PòæØ&æ§N!R|dcåjÅçµKdIL@÷TzòbÀ;òðu niÑ«½) <5ß!5q˜1l&Š÷³ËãTt>hCWEÝèSe;Þüîw-6x9¡–Ì:üþüéYøêo|Ï\¼Èð‹€9}þ,¥á^¯Ë®Td9ð)熭)uûÀ·®4íñ½µßÊš‘sñ¡Ì}°:•…{ØQ2¾!höB¶½lÚÊkÄ>þÿ݉lÍ GQKs"oÏñívÀÂ]…(Z›å A o¸R²»—iWyMrqÉEÐs(h•mmH B&šÊÿŸN-g-!Õmlccƒª1³.4¼Ö-ê]%’.E³Õˆ3Ïœ‰ÊK¾üË¡öËJÖÁMú€'Ê«ñî–9õä“ †¨×!tp1Ríí‰+êE«m«^!ê¨ØRSãHØÖèÀ µo¸_ÐZ[æîaóxÎÙÞ™› ‡|ÃÏ«–I£vgõ€QÊüÉS‰ £ÙȤ¦gÌg›ã|Éíï€É <8Rüî˹âqPM.B.Šσ²ÖJ·ÔYÄìK©"$)^ÊÑ$FŒóÄ“w²ŽˆB*FÏ@R¾¿©•ò×$c¡Þ/,;A›ÂößÇÖ퀉±¥Ÿ-{v÷tƒ²Ax¹xe}¯Å÷zý0e–ÉÇå–îO\‘¡´Úëû¼ÀüÏÔ¼fYW¥¥G|$àénμa)S¾ñâ8(&KˆFbÓpâÊ«ˆ7ÝDŽet¬ç•ÙJ´þ¹LËúŒBÂÊsªƒªIʼn<±áÂT;¹r£$ÀRIë'aRq¨T¤£öúžÆâœâ¤L¼O™ºTæ®6"V Ìý™·Ga¯Cu¿¦ÆQKçÕÏ“$@6ŽKà3wÝÃüÉÓl?}ŠÐDÌŒX›&N9{ .Xó:=˜§(òüò·xágx.VæãÎè?ëZ˜c<=ÛÆbqeZûeŒ2¾ƒ¾hi|̵áæ×ݲ°wV)/ä‡Ä¹^ˆ× hiø}¤¤”Šÿ©Mý{3Œ®*OÜȹŤC¦‘Ô(3Œ¬Š%'fh,»¾§Cº~ X•å‡.ð­¾ÎÚº†ÒÒóø-8ºwʹ¤Är”l¯8¹…*ªšØyâ î¾óƒLC uAš2fVw˜_®ax«Ÿ›ÃÇe~éb|îáϲ¥3.qáÊ9+ð%ïûþüÿýó|é·| ;²aƒmwÒFCë C¢0 Ø ™rÙ×ëÕ*¿A>õÝ4–ý *•õÓû¾ƒg#Ez»m27Üú%´¤¢š|0öÂ’°¨× 7@B:– evÈEy¨/J);N¯)ó­¶"»S¾üÀ¦6ä­9iž0Ý£dX³xöÊø‚ •—½ö–Ú–/ŠÚ–óÂ@hø._(å«,$qÇw÷‰G#âìhf«q$6òí¥—rëüç|ï¯ü/ÿ†÷uÊÆÌi´!‡BN6O´’±6üY+qøöÊÒL÷Ÿ¬8§ wˆŒÏe}éÝ?¢;3ë8våIN^{dšI jáã™.´õ´RÄlää…uj?/ôðļªש‡ª‘7h†Qù<< áÃs“®#z«CF0"Jè2›“’´­)³™u¼œ§—YUŒe$,`Eíµu+Í©ª¯­LxÅ›ÞJŽ œ¢èKeì ”âÏÌNáyW²úr÷ h/•ðZž2r½ŸÎÄ2I‹6]쌳jŠÙ8pý¼ñ‡~ˆ¯ù©ŸäØ›ÞHöÀ4ªŠ„@°Ž‰)âJÖÚÍ•@¢ŒC¡Râ„ EêÝBIÃDŒ@.oʵúïýðªtãÈÈðX»¦}ýc)Ø pèìÍQ%û¾A;/×.yö¢& W¿ìZlÒá2§Ï‰¡Á5V1]ÇÝPq¦.L]Èdæ“EiÛ@U­ÆÞFñËÈS–ƒpÑ—öœ²;–nd¯Ò*¾xÎ=3 aX4í|Nn»b–ÝëuÕI‹>óÛ­‘W»R£»Ö6 —^s5ñÊËY[% a)Ë^øÖyâ§,„ºAÍ™JS ÎÃi¹úWôxpÅ_Ë×ÿ/?ÆÛÿæ_ƒßÀælʤSºiÃÙ‰‘#äĦ€Z‡¯Y ¹€ò¢‹rÁEÑÐÃbk‹à£Ãã«2´#—¸kdæƒj±8ðÅà¿W\;G7"7ÞtÙÊqå8ón¾\ªjÉó|ôÞGÿKÚgÚ°èåûë—9Hëxo;Z6Í$¦}^¥BÛµ¤Y*FÝc±Ïñ ÜKFiXBÁ‡±'ÎL¾äõ¯[h‰•½\^s7˜µ”ùèùÛŸIÖC#W_=9HíÌFTv$—`Uò40'1&¼ämoç;ÿéÏñÊú~ž¾ú &Ý”cm¦I†Ga&FG&š1ñ2Çb•ª¤^ȵ*B®´—CøS†„¾Žv`à;(C; \>lÖWÖwÁåÊ͘3m¹æ¦ë˜žØ KÕ$t#Æ@Ó„RÕKë߯üŸwõ}÷‰É2Ñ]8güÎp,Ì€¨ÂFhˆ^Xú*ŠšbóĬ˸K¡© ËDÉ}(^½Ï„†W¼îõCwVXèŽÉº‘ YÓ¼8?; ©?Œ¼NZÔÌáøe—¢]Qäí‚ÑMœ§žz1#xe’WX¡© "·}ë7ó}¿ø÷¹ú}ßNn6h5’] Ú0Ñ„š¦›ôå&e¦2º­å\ã;b&3RzˆÀz. ­=*/Œwú,/¨2kZ^ô²ëØjç·3'[&¥–6Ík€\4x¼ÒNJ†–š»ÞCýžó9Ü£‹ï€+PuéXдf~“ˆ¦þb6RñœImq³¢gýXËÈhÜo­d§§Càä-·Böâ·@58© ÿ2¯—‹:šïù›ÑŒÈÊŸcíK/©ŠÃŇb’œ­G²4 q¸éI ÓL§—ó®¿ôý|Ï/þ 7ë7±6Ñ™°Á®‘yÍâ´6°º:Ÿ ^ Ó}¹ƒââ‡â]î ë²ÿÃUÊXÖÊóƒÊò.Ùƒ»¯rÖËILv'd߯|Ù5l\u Ò]=üÅŠ:J3hÐaÒ¢´]Úñá¿$n°r¬Uœ¹ðžÝ׃Ã^-ë‚ÃF=Ù†¬Ü¼ 1'˜uó./²º!YGºz5^yó+àØ‰º9}P@¶l+qÍv‚óãZnNë°Jxxƒ¨Âôø‰b/è‰À4“»¶àNFqu®?cžpŠˆM¾‚ö¦—ò•?ð_ñg~âG9öú[xÊ S2PD/ë`9P)I÷༠Ní‡ D‡Á圻£pïvÑböûyÕ%J‰%»ÑYæÊ¯aîóêêW|Árb6Ÿƒø`ì#Uk²üû^»î»}pA.òð¾h¸Q J½ºpðª)ÓPŒ¸e”m¨ËÐbo[c>o‹{SèÂÞdÊÕR÷K¾âÍ¥ìr«þ e“JÐQ°µx×ùõì°kµ¯ ý}Í™6u¤¹–W“ ý“^ÊÅ`"Äê X‘ûjCfbæ!pÉ›oãš·½‘vc‚t-Ѭ.†\5ïzÓh)nw°ËÚPW! å@|ì(<¹ÇÓÆº~G|kK\ÕúY%³‘Š„S(Ýò“—žàª—\46e"‚§<ì)³47 ("{>¸)¡-¿ðι¦Qõ°´˜›‰Öt¯ÀƒÒ厮ëÈf‹A÷ý4ñÆešÂM·¼‚BŒ8E¼²/[w³ÝmÏòïü«oWàËUNˆL66‰¹hÝes $‘rxäjëZÏ“ ”—ʘ2‡ QŠgí‹®¸š‰›K&FÕH*˜–.c0A]œï r¾wTå“qà“ý|iŸAп¯Ù”õë¡®1rÝ‹_LE†ËÝ ³ÀËž—›õ¿á«í•qSâ\Jî?Îë9×Ãë•D¼&GˆÂ€· z^‹;=Ú`^ÝÇSgžRy@MÊ‹¡d ¶¨·zÝ.q'$cC¦´sck¾C°Såå¯~5¯ý¯*Xø…ô–ÊåW^E ÓºQg¸ÍÙÊ=B.@'ÂB«?[$‰ÖÉ™´´‚¯¸úê<4ÉâP©%×eÂÏÕyÜý¨&aoK“‡(s÷|Ý5š ¯/š.ãª.NÌ–Q˯¹߈õ¯ÕlÍË=¯Ç°”3¡ñ¨è’‘ø€Ñ®É4Ÿ™^|Á—A!O#7¼æbÀ“þ ß{FU­ UÞºëÐIƒ$¡‹S²'ÈÜÿ›ÿœIjyýŸúv¸æÚºÁ•yé«Óh* ÈF& tRÁ‚«¯eÌûIPȆ‹WaØÒTr)å™âK Âk?†2dz¶RÆíUBîU¢šì±í÷>tÔL[ |ãÌ©à#óqC$ ÅMè%©B„ën¼žn7Ü|ôVjy;TENΉ¦ÂxÑÅ‚µ¹dïNÏ_ÄMžû ëüéÒö §v䦊TÍR°ëq¾~q•:ZlÞÑÍ3ÙÀëi6˜r‹Í0·A¼rNäú[o½˜Âû’o±‘« Ú¤ášë¯ÇtBN‰& ٠Ξå®üOù…ïüþýÿO|ä‡I†ÆŠðV' ¢‘IQÛ*\˺^ùº×1 šHk©ØÔnlt%ˆkûe#.ÕÄæº¯{f|{ˆ É hÕeo×ëΩãxªˆ$6/™râÚ+˜©á¾€"zfÂì¼ˆØæœxiÃ;W|ñb†÷ «”©9MP&Ê)2V¸d¨ ª^ž¨àºy¦;æhS@mÉF‘Y×cÄ͙ƆV•¦An½íbp; Ýëǯú_­É±“'Z()ó.1UÁ»Bàx˜ðØoý6ý‡ßáŠÛnåæoþ&^öî÷B6$(¦ŽªÓö•Ú0Ý<ŽK,'yÊÐÄaDׂºìlöÛÈE}e=¾w” °+ë[0mïìpÉ—Õì/Ðw¦ËÏe„XÞ›8­$n¸ñtZ§*lD ï3½ê7 Ìxõ¢Í¨(†•ŒÏ¼ÒU**ç,WP{%&ÏQÛî…/5}­âS 4ý-õåaY™i5É5ëSR›hÛ®dyýâê21FD Ò¶-æÂËo½eQ¯]¼öfKˆVNXÁˆ„+n|1bÈdºÉ‰€ånØ0§>ü1îøÑã—Þ÷§yð7ÚmZwÔ…DuÆßt*M™cÚИѓ ’8BZƒÓ®fXûuµòÑ\|Ùçá\ýr€ííÎsQ\¯L…Uíow%‹á'.»áæ¹¥É Û€Ü-»>朖ðºñg¶¥3O–ÄöÊN/ÒRž¥+¨ÒTw«Aqåp‘“”…y›™§TžJ“"å4sêŠeŒ\þ¢ë`:½Ñ±”_”Cý÷Ò\ºÉN˜`²‰f˜zš™K L;ÁIÚa=ÄãÇùÇßñÝÜýÿéìYbg\Ògx!ðÒÛne')²ù0JV2Åra$/¿A~]S¡|¾OSCÏQwo¿÷Ðgˆý¯¡—‹û´¢)Ò°¹ì%W!—6EP#—,¯t=]¢oXŒƒaΙœóÚ,xÜžÿM‹ó"à;þªJ£…Š¢KåȰê—Ê õ$uA²Ñ¥D—Sñð´’¡Õâr#–3]v¾ôÖ[¤Î‹×â>³Ï¸Y/y?ân½ä–[è<¡^ÈÅ–"ꑉ:*f3‚:. ]˜Âqâ™îùÙŸãW¾îOðþ¿ûÓ´?F¬xÞäÆk9=Uv°0ö·]lJ)ƒÐ¨ï‘ÍÃèÖ8˜ùAê¨ï o•%Ef×2$²æßñ¨\ù’ëØJ‚Ó"Èá²r+%nHYmàeäLܼ±>žŒ&-Ö½çRò¹çáõžÙ‡›–(S Rwö\£•sÄRêG šq‚ dÒHÞ&Vãà~qä…»9R娳yîts!L\:r(<¯‰GÔ3Ya+_þrvˆl^ŒqûÃx{IWüiãøI,²Íé*áNˆˆ Ù;¤‚QÁJ kÒaê¸ " ³_ú5þÁûƒëßöfnÿƯãò/} 'NœDwN-ƒB§J¦ðÔ+¹Y¹–u³[ತ—Ú‰t÷¥8æð¹5ؽpÁ…ºÏzŸé²ßm¯.¼È’û=ÐPä2òÂZ¦X•ÑḦÑ9yõI6Nn²œ.Ïd¯8é§OÆA®ÎŸ«– šRªÞÅw/Y*ðT€ZZ¸î>D5—ŒKª÷'Px”}îùª‹M‹sI)T˙ˢëÔ•ÎÒzŒ©‘µ”Em6¬í˜åÀf£ƒêRÜ´DW^} \zéE#žgáºþæ—NR¥fMP’¯Ï¤ž^2ãmÇ~ëøÕ/½á&^ÆOûi$ðL¨£eZKÚB@Tü`ZH¥ì’;rc/RN'³ ôˆY¤É²w†ŒT‚–^Jk&PcvP!»2'ñâ^„AR&¨,•fŸè®@'U[Á\1Ü©ƒ±‰x— 6轇Ë!°‚CêÅ.í3n¾K²)ÔÓRšf2$ÍÚ+»I´î:À]¿öÏG‡ùlÎÎLÙ› NSv:7Üp#„€]ŒWÏüºürˆŠµ%ØÄ™§‚eó%áÊuøÖÌçÊfv.ц§¸ŸäVg™ ÄJßÒ…T‰¹â¥zˆÙ×Ú1–k»ƒÓ®÷á½ÿŸ½7{’$»Îü~çÜ뙵ö¾£,ìn$@,$g8gáÌhh6o’Ì$™d¦ÑŒL¦ÿBúô"éM&³‘^´Ì˜ÆD͘Œf2€ ˆzCoÕU•™á÷ž£‡sÝÃ#22+««€®F¥ÃÕ•á~ý»gùÎ÷¹4ŽÚ ¾± pR‡wÊí› ç~¹ÕñÜ× X5×ÉJ¬¤Ësöy0î‹Þ4E¤ÙèWkÐslãs§–:j)8FÚO¡¢|›]é¡©x^û“Ê¡I@5Ö]Ñ“ºo©ÓšÑLjÚa«ÕŠ•I;Äœ¾ï1QúœyÆBõùq‡ÇÓOÑ«Žo·½±4±Ù490JL,Ô¹®…ƒìØ,…¼¸†|{EC¿P‡HÍHø-¾v|ËñÚ”œ¡^7HOå¹g­ï|;ìrlÊ’ÖÊÛreEŸ~ ›++«d¼ØF–3íÒºëXËÛŽ©nXïÑ&=¦…74¨Nÿ®ç€wG)m2˜w³&MTCäÐEOâ^1u¿jõIJ2ú•Qj,†Y×Ñã,Tyâ㇔~ê÷À¡Â£Ï|oæÚæÑÔ÷ hÛ¶ #ÙŒ™ÎQf®Ì%–äJ_ƒêÂÌ„™Pµ²ÈÇ­ §Cð£ü®4w‡Ài`Ÿ××÷K.ïßÇ5mN+žŸy"4k¹¡Iƒ~5:3Á¬MdX<¦©®µ9ÁUé#U=!ZÝ¿;1¿_ÏN ³;Y„.¥‰Âð®\7†DZ3Fƒ¬/Œ8øÊX­¢ŒÞÍ:ÊrI—BŠìGA IDATH?ñ‰¶»w^TÉì]y€b0ë2IÍ‚›á^› ]›iÖ¸Fi²lKή–Ìó ­± IÐ< Ã!=‹&âBžÔ7,1 9Þ˜8-âÛÕA=ÑŒZ‚¼‹Ê2ønéUÙ/º¤‰ ã/´pñ‘+t{]ÌåqGkvX5˜Ïâw[i#ek¼óæv&Ú”¦ïøêžŒð|°³kWÔTÈHðw’@5g6çâïþ.¿û¹/ò£o~‹×¿÷=n¼ñs¬‘$…QêÀÙ©Žj¦ÇYyE/^ ÷%@Qœyš¡ÕÐea–g™Q3\/JáÊÏçH½c•ž#ÖÒnìÇ^xž·ß{EI­~—б|!¾£6ä»#¡ãàá;Kå·#ë´ÓXºuú·Áh—ù·|Ñžïþ,ÃkÍÕ›µ;ŽaY¨RyèɇY–žúˆ¨¬¶ ‘„Uc¤·ì€WÇÚë§`l5 °æ]¬…ÁÈû>î9ÀÛ¾¾¢q¢·ööæx5^üÇÀÇÿþïóñüÎòæ ÞúÞøá•þ§¯óÖwþ’·~ôjY‘rÂkÏ\fÌ{°¥£sµûyÎÅ!¹ËÈ]¼ ªÌ¯\áéÏ}–§¿ð›UØ~ãÜüÉO)¯½É÷¿òU®ýàGÔkï±`­FªÎ~·ÏÊ£dUW@XôðàãOƒvó†Å]‰ð’ré±'Xª2ºVË –ÊZÜi½Ø)ÀyRÚº[z}õݪNvz½ÙGßñ3Dƒ¤Ó¨Ð}+@Û=Z·kV\ˆy×âÆ#?ˆe£zx)›{Ⱦ»’<ÆëÜåD Am"3åvœ!aÕ¨V™5\ê–+›Þ[}÷„kÙGoŸõ¡†×ž«2ο¢Â³Ï>Ç£?­†á5DЉ²n#x~ô Ÿ…ÏÜùÜýO±ZY,V\ÿÎwøÉwþ’òÚÏyýϾÏÍŸ¾Êµ7^££8ªÀª_ñkŸüdë<5À«5 ¸Ï;<žþè TUL«="©uè·@¡é½á»Áî–å ¾S»D9­i°#Ú_ßÜö¶ÓÖég¬[nd²SØÏ zp/ tCRïÊœ+^¥W UïHI×Å=Æ/Kmëhzàέ%ÞýÈÑóä®V¥ š‚½pžÒÞfªÓf´-pÌBB*ï…HÀo|æ3¸vë435 #<(Æ[j*=Ývω٥}ÿÜçxô‹ŸÅ1r1øñü·ÿÁƒ ãBõŽeV–}eþè£Ð + jçÇ](aì½ô"Öøwb²7 ÀÉÅX°®³s¿uJ¹3zÚ ˆ·jHœôïºõ¹ê–ÚË1ð:Q˜`ówzµÃÛ$U®>xí”b=*óà3X­1k¢VNˆ³sßÒžÚŽþd2ß<;”ÒcÞ›¡=ÝqÌ]ȼ+“6ì=âFr0¥VTèªqÁ`ÌÍYæ#¿ÿe¶9ðƒ„ø1nüäÃôl&fo+J%ƒÁ«ò5ºº¤X¥æfÝÞ³L { fÐ$äÏSÚ;=fX°9—yœ¢Š$ ubíµv[#b #b',ß³aÍ7åJuùxgª7m*l)%›8’t,×µ£©0û¦ÜÓIcjÆ„<Ýp~c&—hîdK…ƒ´dÿéÇ8J ¯J*…Î R ˜¡ÖA5’ÕKˆÜÖ‰ ÿDåX yPPƆR‚†¤T µÞY.kS…)X2”’R­nê¹yù:•,í¾¼!­µ­]¿Y“’QJ­‘Þ¨0Ë3ÄùÕ«¤Ï}ö®$UeüýÊ_|ã›ÌrÊqaÌ0Oÿæg §¡¸ðÜÓâ*á±ç?€Ô”¦I»ò½õllß 'ÜtBb¸xÄG8)m¼ÝHecRc‹ÒrË÷;ÃïšN^Ø wÕº£Wy˜4ËX_GûÒRépÜ N›DoÓÝÕÉŽˆy:e2žËéõ«ÕäšžM‹ò¾ŒðŽIô˜Uׯ$:f¦ûšpžÿôK°§wí¦óØòùÎ7þ”y:ajMš¸üØc¢#7¯Ÿ³Rîʨ*•Ç_xâ>jnÀ±ÎŸž@p=ƒ\ûnðYG|Û£\g¾S<1Fãê¡}¨[ä D’¤©«sõñ‡bB©V´˜ KbŽ–»©*±ZðNŽ›ŒÑœ»S«aàYV•R Ió¨ÈÖ¼ðæñzßžL¦“ÛÜ÷z‘½ô¨…jƼ›“T;¾ðw~¿Díæp¯¯¿ÎáoÒ•&#•Z ž”‡žy&dç5ÌúóA‹;?ªÇ„E}þ9\st'KSšBŠ®ÛEãMyVð9Ílªh2D|'õo7J;鹑®Aðv¢Æé{Öæ=‹ ³ sºKs •¦T¼¦ÆÕˆõ†š\mê(S‹öߊ›@g¶KoåwÅÛ´ÆÑÑQ›ÑÕZ¦ßC‰Ð=ñQ\ j®ë[b”,!t³¤ÔZ±$<÷É—9¼+ˆ5Š=ßýú7èŠ5n’!8I3åãŸùu|P9nÝ8?ðîJ|m@Ayú£ƒ”‚ÛR"!‹u©u}ówgZ\§øÌn lìƒÓ*§ƒÐí¦¦ÓÀÆëUv›sŸ;KÂŰä\~ô<9æ5Ê>‹Ã#âk)lOWã¿›ìûôÜØº–Æ,³´HOUY.K8›é6…Hz㼺•ZŽÆ=íDbÑÍ4…GH7‹aógžÁζäO?’’©hïý»¯Å ÉJÕ(.çf…òèSÏ :¡2±åÇy~¼ÿzÂXRxäØß§èPGªãÇË&á‚ÜwnGƒá´ÈM7ÔJ†‡ì.ÉÜfŠ{+ù¨oÇëÕaåN'.?|•Z®IÔ7ÜèÆôvê7ëSPÓˆ.Ì­è°íÔvâpFÇ¢‹ƒ£{ºSûžµA|ÔóuZ+ŽeÚÁ‘Vžûô‹!ðx·N‚ -ùñ_|€UjÛÝBEŸxœ~zÖj^»‹€§í¦~ò…çéUñ´9•`élQÁÂnŽ4¨¦¼¿×³¤§ÇÎßRƒ‘ßâ3œEBi |§½H'KÂü‘Ëx'$7èk4 \0£éÚyk¶Ù¼¬]•HKÍ7ÎÌÚŸ´÷²uz;L>ÕèÞÖ›ÓÑr1ª«œ< ~à€7ìæm@¨-˜4îž=s¦Ë¨P“òÛ_þÒ] ŠPÞºÆ[¯¼Bq£6µmB†Ï¾ðXÓG®R:§¤Ü͘ZúùÑO¾DIÒTS$ÒµaܳQ1ƬÀ¸e­L¶‰ÂÛ”’)ç­ët¾3âÓ©`Àûßí÷ÛeK0T“ äÄ•Gbᥩ¡” Ã¸£Ù’ÔõìíF[ד'Ǻ°cÏ7fwmÂÓî‡a¼®–B_Ê-åÀøÀ‰Ç³šèÝ@”¤†úª9dÇ´]®Î¥œIֳșw;åâ?w×<%"l7~þ½¿ä‚{%.9³ð‚¥Ìå«W! À,ãi;‡¼»â«¶_áñ~ŒŒ‡²"}¥j‡‹QtI%[B½Ã¼Rµ—g’ÍZ™Oö›Ÿ…™àM!ùN%€*ßýê×è5ä‰T×MÉyˆí|0XÈrN<¾+9† I‚'gþèCxÎXs/ð>¦RJB­w–>˜夔WOãàp$ÂZtÔþ A‚Nñ e'Õ±î™.ÌØ¿r!d¡Ü76á¬ê01Ñ€LØh@DÎÕèh´sÁó[ŸÚ9&WÜZ½Ð…R ¥ï‰\9·iœ|yJ­NR!kxÌÌœ}æS1Ï*zWŒa 3ÞþñOÙóX€µVf9äáûä<ý‰  ,oŒ&Gxw|þÛ@…zF’3<ÿ<®™,á^6¤{3WÜ w¹€¿opº(ïvÞã¤ÈïVï“üöÀòòK,‡ä²ÞyÝs†óö7þ„yuf(µRî°¾‡4c%ÂåÇÑuåG"œOçmÚ;_€Ôé t>þ©_.­3˜GSBS½ÏLÁoS•ã}MKœP“›¦‡»k>ñî—ÈÍÖx‰¶ý¹=„ dÇu$'ö¸Hï%@¨QIªùšl<¥ŒŸù8½„zBDǺQ'u tNŒG¹Eê]7¬½¶î›{çQÞ_wm´…6± ™_ûô§YX)ÑWçÁ'ŸäKÿàð±O~’ýK—ðœ×z‰¿È*ø.îÞ§5Îôýe ¢Ûß#”‰ C£áþð•.±wñâ>fAo ´RŒµHÀŒ' ŸJBá`7›ˆŽ**¼Á³¶F³Dš,[¸þEǶ”J¿ê)µé­> žÖ j˜D3ªsf¡dá~*=_ýçÿ+þGijŸû Ÿ}’ËO=†>ûQ{ìñõÅÔ5‡(f!›z¾ù–LûóÕÑ¿÷6—L0K¤Ô¡u…IÁtÎCO=:k'ËÚ{¦)œ+¦Ü…7š=t€ÔñôË¿Îëò-fµ‚:oô…ü³ÆGæû€rãÝ7yåÇ?€?ÿ.¯}ûϸöýïá7oP1\2^ W¥÷’#Usw²æP®6¨ZOÒvp÷Ƶ&¬ýrOxýZÀs“¯7f7¾Édë÷µiŸœXY!w¶Z±—„¥WöØçÆl…–õg3"ÚÓ¿Ï›LþhX×Ôþèê*Þxxæ ê-11H6¸…Qz|î¦.î5Vâx²ð«ès»Àµ·—¨Ì)é&V j mâ÷%àY+žÊ`B⊸Ы¢xˆª2weñÊÏ9úë7xë¿(%fµ²LðÄG_@ºÂþ“sõÙ§àòžyéE–*<÷ÙÏyS´é»êÀ,áðû?"¯,è(I(Õ˜#;f<üØ£#ˆÆîÆõsŽuw¥‚o‹úiL\ž|á9lÎêðyJ\¿q£?ÿ öóóx—}”—¼Š}áwx À{ß~›7ð®÷¯¸ögÁ[?ø+–7Þ#u@_è$£–9ê{džé¥’ý}:™mòœôzßðÐØœÓ5¦wN©ñ™£Í/5ûɰéÂØiÁvиcýÙ’²oÏÐϬ%(.¢-Hh&ÜD'7Ë`^?›æ„V+®q¿zPSTŒrг:ZríÝCÞºFꬳf¤3òðN½ïoFcƒã¬D¹)Î+æUPæªtnÌEIµ’U轆ë’ªæ’xçߣü•ᢸ†–ñ×’tTþêãOpéÉG9ÌÎÇ?ûiVYyû+_ã’)É ½$${8ª»#)óØÓOA‚*'kê½qŽxwž13šB“¡…W?ñq®K¸puý’˜ó½¯}Ï|泬Ú]7Ï!·/ÀL}„gy~ûo6à1n¾ù&o÷»,ø×¼öÍosãµ×°wÞ ³µd~JCá Þµægzýñ Ž6/;Dgrzã£ZD{½ö.^ w]HL~¿o™z«1øºñsµhÕ­Lþ®¤xƒØ€µ@Vmý¼–§³„.{ì`ÁâðˆR¯°JIñw’Åœ7iïBN«kÞ}¤hæc/¿ šY­VÌf™yV¾÷•¯ }!7Ò±w=žzLzR Å·ŒÓáMÑw:Bèq>÷¥/ónº½Œj7èmÓ„' wŠ:Êp¤!õmJ0ÃO_›šxš$aÿêeúT‘´9þ5‚;961vY›§‚»ªÄ†_}œS¦•H™²2¤8¬¿Ù³xó=^¿Fÿó›È»«(ý¸‡·³µFž ¥TJ Â8[ÆI†S0‡Ÿ×ûð’Cr'¹#áâ‹%¨ÙY©PSt”Äc§žy8]¨ÂŪ«ŽrS”·ÍxÂ5qVIH¹CúÊ~ê~Å\„„ƒWöUñ£#ú.QÛõÈ)5w&§Ë3<+tQcô]çõ°îJY#¤)¥ñ·zƒ’•G?ýë¬0tÞ±0CÍøî– 0§ápG¸dÊ èŸ7Üï–Mdë ísù‹¿ÅÞóÏß~Dz"€ÙéàÇíÑVDlí²×Ö]7›ÑíÍ)V#Ãð:‚Ú†n]Ó¼›O€n¾ñ9Å¢û겎æzH‹‚ô¬Þ¼ÉÁ+orøú5êõ%º¬tj‰¾K¬$|ITI„$Âj±å)…`P¨jk p¡»ïo™„šR;6–wÔ*¹Vr5fNS2! Å©Ôæànãè¬Ä¸.=oú’×ü€wfÆÍì¬ºŽ£Z@2‰Œ»¢ÚQ4ZìÅ ¯MŽòêSŸ¹4¼µŠÎyJ{Çž Åöá:¹\˜ó±O½ÈÒrtÖ9<âæ×¿^ Ÿ¬ `ó¸ž4 Í$ “ëdœÉnk&'^üÒß:ý³¹ß&èMÁo+jÝñ­ß?íhæ¯÷¥½Y4$ô™Öè|³I2µq†vëg¸Săb2œ÷•rsÉÑ›ïrøêÛ½öåí¤Ã¼&æ"…Œ7u'åD‘Ê‘WV–âxSg0r TR«Þ—j)ÚÔdAQ¤©.˜Àg©JI­‹‡ŽCãU[[O×ö =$a’9*Æ{}Ï{ýŠC7–±pTاF;’ ÉÂKôH…•χWjRo:Ÿ´¸ã^+)ôtÑ]—8ÍO½üëÌ÷90˜{áÁþoÿ›QIÌ*† ra¾¦9Š:ªi¤Wî¡Æ3Ûã×þþßcæ<¨ÒêdY¹¥këz£Ó™ÑY(-÷Yê³=\dòh¾±Û>²“ ¦kE)XhóvqÜ ÞúÔ³ÿÀ… i¹“[mLW 1EJ›k5Ù ¯½emèN–К‘C§¾uÀò§×Xýô]xkAwXéJ¢£C´Ã %>¯T ¦^²&J¿ˆûYg,Ð×è,'3´ùÞö„€oË$ðÂý§‡w–¯MwI÷µ3ñõcòÓ&…Ýà•;GŽÜ8´ÊQ­ô¥ÉX#T”"Fé”… ùøÇAuÃSÖFÞç¦wg*ƒ)züŸM"ê½ü2«¬È,ãÕeá/¾ù-8:¢¯Å L£÷âÑê¡G($‰ÔWļ6f IDATGÑχ|Œý½¿ËáÞ>Ë$x)ÌsFÜY•–3Ek3½ (’èÛHá¬úmF~·Œw‡¶Øú=5J*ó‹ûmĬ‰j¶Áÿ^­‘­#5U‹t3ÕÆ¥(õºl03!›„ÇE¼sÈá+orã§?gñÖ lÙGc£‰9Ô– >ÃßkUÕŽÚÆ,½m&ËRZTDZ&Ì=°ÜîµÇ6:TeåØXÊisßÀשE(*ôGîºqS*×­r“Ê!F¯‚ç+sȉ —.)vÚZ–uw&r~¼”V&§r(¤vífŸü$õÊe–@gpA3¹ ?ûÆ7سp—3/ ¶6•ÖŒY‚4ÇÈ8—PÌ”QÉ5ÃËçpSsXA&𲌮ë(þÈk¡xa•øtùýwOSÛ6MÕzD‰{ûûµ~A--ãÃÝFËÓ!mÍEÈEÐQgeUŒåµ«Ÿ¾Ëê{¯°xãr}ɼÀÜ„™5"¸äA™g=M€tò|_¨V"Ý>7âæ–õ’“j&Ó¾­¾®&cƒÒC‘x˜&Ê2 G xc¹àpµ¤wgéF¯Ñ²m}]£ñ[€îùq›Kp¸Ñ³(dåÉ—_ÄU™©RV+ãÿýWÿ,W‘þIn¦xøPúˆÒˆxå1oJ+†Óãô¤Ož+?I’."îÕÀª“ª‘¶I]H㺻CÅåÁˆAáØÇ3" ùMé:èÖæV§êÅÚW¼/¬j¡ zz‡dù¢‰Ú«kKV¯¾Ãê¯ß¦¾v ¿¹"Óµi̘;Š&CŠ"O‹&‡½!5±d=þž| á¢T”ƒU zØØÙbH #™ù<ÂÛõe­´ºNm·ŠÞ‰±áÖ´®e$ ½¯:”b˜y6cˆqÊÇ?÷™˜²–v#¹&b®öœ–r*ÃF"øÚâIa6ãS¿õ7¨(R< ¦ð»?þ¼ò3¤´ˆÃÖ`‘Š©QŨ^p±ÐÏ“$®ˆwˆwø¥Ä—þß•9À¢OR%¹£Cä4ŸÝ"ò¬]Y×ÀˆÒ&<9ö.ìª*îRM¥Í´º1K™ý”éªR]¨9QD©‡=ý«ïPú.õ'oSß<€£žÁ¬À H7§ óVû^ƒ© ‘œú$©i?ô&`"ƒeYE“h‡´–íjêœÞ }/³µ6ÓŽnÖ4ÚÞE§mû"ZR$iyÕ¯°Z1–n£;Ö.Öˆð΋xwÚ¯ÿð­²FVdžé%L•¢P$¢´ýeÏOÿÿ!üŽFÀ°¨ƒú9të­E}2Š·F³Þçùø%ìò%*¹è£ngN²ÔÄZM¸9©Ý)é$ÐK§¥»íu:Ÿ­×b B±xkvÞÑ/+Ëe(’¤#£¾zþ¯ã?yç_ô¨*³®#¥êQ¤±¬x)qžR­†´uxŒ)´±{¥ë‡6 =X”%aÙ“˜Þºµ/Øœå{ý~¶È†Ôv¬ãy„Ò²ÂNv9N›ŠÒ7«Š’›õâ²Vd6ãÒ¥‹m®prGn•^ÎËxw!Ä6 ÉýÔ|g­ÍYÏ{‚Gž~šò£„ÏpQ„÷‡ÈÿáR^xùeVó³âÁg?¡*yñeJN\}ô1Ò#âfH—±¦bÀì ¯|éþ€ÿïŸÿ/ì—¦ýá³UŒUµn¼´1¬Š ï#¼?iLmÛy-Mštº×¡ª·P;TZªS­Ç´Ã{Eoptí-XZpášUh7ÎÛßtÍïà ·M»4ÙwDÄ{3;fÀ3ôn¹G oYë¨Æ¬’ÁK{¾ìºì~_Þ­¢Ìl'¸œ$<<€Ý¨Y7Œí¸A‹òL¢žT¨5ª|UÀ»ÄJ½O| ÚN®²éöwtw/À“IºQ!”§[LÝ(»|ö‹_à«?ú ou¤ÊÜŒ£œ™)üì;ß¡š‘UyµFã')Q›dÔ”xþå9rDzð‰—>Éì‘SæáâÆl¬¸XbÔÐ’²ö”Ö–!Xø ˜*·+|}Úl®5•žiš»·¿·QËŽi §/…e¿böú{¬JÁÚì°HÔÏ”L’üx$´™6©R£+"¸6Üa&7§,§ií®{5‹,Œ ä˜;È=WöùàõðhB…ƒà±N†È4ºÂ¼¥àÌ5\“ T£6[«ÍMd­Q6êå¿Í¨OéXYvQÇH(Rí:ð<¾Ô`âa¡ë0w‡^‰eèCãTÇRÁ(äÊs¿õ»üßÿÛÿÉÕ¼@Kº²’ÐV‚–Üè"žâF+4‡ w2«ñÚ·¿=þî¯ëÛàóXû³D· ©ÑT¹$;Ö¼ko-Õܵº·£·mõ” 5@šŠD9Eg3èR¬]Ñ~°dñÎ{ÈͳÞ)]ùôé­ÜºÈcwy«»&xSL™üE›èÕºh“½W$w$SÊÍ‹7¨=”Š7ÏÙSô—8ݸ-qêÔBfpOÉÖÔïìèžO†[4йƒ_ìLgMqO:J]ŸèÞ–Ò„/¾üÒ¸G çÜ/ê°Ö…ÖÆyoÕ6ög|ü󿉡t&tªô·¾Cÿý™öÕKôVŸÿ”ß7®É6˜_+VkLJˆ“ QͨhÕâ_9ùÀx÷û¯rø³·àÝyeÌ\é4¦0¤þâ$?ÅÇÃÝcª¯†Mkæ§lî©msžÞYn÷S#¹Û½œ2}­¨*µón†K¢f…„zÒ?ðî*ô1¡ú8*È4ûÆœùôßþ2} þŠ5ùvßîº;QÌ1ðS´ÛWvt±³Ý çI0mšiýZkÙJŒ@¶J¥+ô†ßì)ïpôóëät5E=Ž`Øä{ò/iÊÎùßøyAXÖ¥ÅÚ²î0Þ“ÐsO¤´·“†º„®~—sg[ŶPîÌ)®,õVs¤Ó†jìq9ž‡m¦sÌ»³#ùîk4µ’0‰rÒþóåâcOâËŸ!}]Žô¦*¾g¿›OŒFŽ¥²z¼¾µ“™$Òð– §ë:]½Wz£.zlÙGÔÖj‡’C³Q­ÖjœÑ\@+Ê1bô/;Ú[YÏÊ“HÛ >šŠ ²Qû»¢«{?ÂYošò2fÇýÂÔå}E{f6’›5%Jé©î<ó±ç[Ä¡87]åç,¼»X¶@É!Ä'nfÊ‹_ø<7U±œ‘Zwͧﬠw›cP’WFƒÝq3 À m}êà¥b‚§öFÿîËëG”£U8ƒ© 9…AŽ9ª2Ö¼†yVBAØü—pû,uïî,‹µ{›jö÷ŸØ|øýxg Îqk2È–/ìû½Ñ[V/•,!1å‡Cƒ“ïžóA‹»\Ëc=çêàµÑ¾®]£Oþîßâ ë賎²“êv~ûw÷1à;mRB‡$»•ðÄ¢{›P²$’+¶rúëëG,®  #­¼©>Çÿ ¼õ¨ àj †%*É¡ûò‹)šÕ‚¨?ò:u<9r69-;IŽ·¤aȼ£fr» gfkŽ2/s—Î!í—x­}`8ͨ›0UÂîùç¹ðÄãôÊño轟öSš'Õ÷v)…)4#Õé—…ÕÍ#Vר‡ ¤/ÌÈÔÜ·„]I&1¶(FÍÊ*IˆZã™…6¤¶1Éîº9n•:²%Ò¸ ¨sÏjE~à€7Å'õÝ€5¦ à £‡ƒÓ²–QauÊ Q_/؉øõh8¼á#ªÞ,kóÀ *ÅR7ª!·5C$Ò¨çÇ]ÉgÉšmCg|´ÁlPhÒAw‘ç¾øÛ3-'«OkÔ¨›¤»Ó‡ùæš`ûïÓ÷rÉ‚öo£p®‘1¨*IB(sq¸bqcÁòúýa nŸiø³Ö6ŸÚ´ ×TB<‘,‘-‘<žy1Øo’1ÉÔ»yA@®LéÉÓùt÷B#QÃîQ §Òw™·k? …ä%fS¥A¤°ÑˆR¢žÚ½öÚý'z§GµAr³[7çmEϕǟxüÔ{ô<¥½» ç'üÌe’Jµ]ï·ïoQ%ŒÓ§Æ8ÇRÐc¦Ú;Gœ6n¹…ŰÊF®ž(ª1k›$ÅÐÙÊYÜ8äæÛױö*P'™Ð:·’´µˆv¬Êêd;îÕ ÷‡>H17´1Ëu܆Ÿœ|e$úMßÓyøñÇ6 ‡çíØ_ZÀ7Œ° ,HwCT)Ééžz’‡ž|Šúã¿Þè¤îŒòvÝŒg“SÝ4®•5"{ê²g¹XâË‚ŠÐ5­8¡Ù´¶~(þ†jrö~a…ŠÌÎp"¨'7ô™xbß— ‹ÈcAÙ‚Åy„÷~ï˜ØàT`àQÞèáÙ€oxnîºãt‰óÐî—¾u2£§RQ˜uüÎïÿCŽtQÇ®˜œœ´ž|Ls­É3)ï$ÕUÄÀ{XÞ\qðî ¯Àª¢ik­aŸD›‡Ã$J{¶÷xp×î‹JDÓ•`IôÕÆúè¨êmEv¬°àÅœãPûaÃÓSw¦¶@¶Â´`UúS¥¨Î»yWížâEW[G !q%ñôç>Ïͽ½5]Blý8s´&ccd¬éíJÛÏ%IƒÅbÅÁÍCßyrp„'yЙצª¬)|^+ñì Fk’›÷l±èøÑþX”ŠËZÌ Æâä„hÝÃ{øù®zÀNü”Ü™NÈ@·AÏÔÖnïÃ{˜Ú¥Ó÷$?çáÝv2*è§€`5bÖ •ž|š§~ëw6"¯±¡>ÊËí¤«Û5<‘6–èR7¼}“Åõ#쨒Jˆ $¾œxÈ, uåê“/¢2¦‰Òœøî#X¿Û~œ¾öMþ}Ç8Þi âç€wç_ ubّƤ1ä– 7ìBeú~m>ñø[s’“kvêÝÍàný2Á½V.òµ¡‚÷Ldå™ßù<9åÍêFg;£µíõs,ÚoÀåÅÈšé—…ï\çæÛ×YÝ8‚¥‘‹ ½…ÐÄFV!M.Þ#mèä³V¿7’£… ̪ôMŠc³ìƒ|þú\°ãß§¡Ãû9àÝAjË]Ÿ¨=òc݋ԯÜal†ãÇât5»?râÓ_þ2]ב5ãÌ‹ OÙ0µ“4¿¼V ï¼ý.×®Óõx©$× »Ò‘·lF«í1šJyÕ–QUï½è®‹ ¼i×Ê8Æç® ²!{/zOÕî†ãïÒ&Š•Ë0:ãk{7ßdoû¸ ¯ï‘Jì°Vb¶²ÇÜb©"n›ï!›5½¢‰J¤„QÁÔ,, cgB=‘ÒtñÖûtž¶ùm¶Ý}²X|CdvíÌå|à2ñAêŒdtãÜøøÿQóQŽS'÷ÂÝ´:hëpëMªA²µTÓñ"Ñ'þÞßá+ÿúßp¡ÙRKàˆ XED铵Kè¤ ×'XªCc’&¬¹¬ô‹žr´¤ö5jví¿¾ŠüÌä·Ê”'@<Ün÷ÐÎ)¾Ö“4©£#Yö1£Å$ì*—µ°°šeòõ|‰Ž×sÍYǨVÆé™xÞßNð?Ý_€wwò¢6„mŽåun—ÑÊúgqr­äÔ‡¹fÔoþJ%ûÚy»¶1§áòöÀ^ „ذ7¶}Lœæ&“Sß××ÝÑï€Ù ®›ûÍPV£XxB&÷ªÜ¥Žõ’2>þÿˆóoÿˆ®ôdw\eŽë7·Œgf+…¢NQÈÍÌznF§súRX- ýbI¿,ÉIb–:0;kµëW³äàiœ"©µlÐNl{Çÿ¨i|èO$““jh幫© kºÁÆ ±{&”Õ’Þ O‰U—Æ(²äjsX˜ZvÒ@P7#¼) X«/v¢kÀˆ™~ëcëæ®ѦÚõ6‰:ãÜvÓ}e÷YAõΗÐ}Çæ¹O¾Ä;òçP+*fŽH¢÷Ÿ¯Ù"zt5TÕ VÛô¥Pú‚W#‹¢:‹&V­MXâ."ô=|ìâA{³`47ú­Q>ݺŸôïuxw1Â3Œ€’ŽÍ‡ñäJ³[/]ì ^{fY©ÖÆã øo>õÛtiÞ:·•ªNUkÞœJW•l°ÈiF8g¥I­^¹¤³6ìÝP®Æ<¤e;9|;KJ*·ú÷[ß¡Õ{fóޏąËÑ$am$Mô¢•ÚR™Z×ì·3¾KqCv|¿°ñˆŽ™û¥"š)RÉ$j_È9Ó{¸YŠŽk*B9ls­‹U«ÿ6áQj¾MEÜ؉|xq÷¹Ê'*Ì}¿ÚÚ›š‹ÈFeNvE$ç€w7këºÜ`ö£I›þ–Lˆ¢ñ÷2¹‚Ò"$ϨAñЫî$Q̈¤MW›}Ÿ@ŸŒ¢NUÇ}¸‰êkÛâ¼Ñ)\àB2ÜZÒwLäÞà ;©”·J˜ BJûÔUåÍ7n¢o²iŸ+W.0ߟ³ê—¤мîáÀ0.r“IçíÐu?1Zä;ýüzF°¸$¥Eæ°”0¢fUé$æPC•×)‹ÂòðˆåAO]D2’f¨Ó¡Dñ‘Ñ9fÇÁàôôöÃv§%ëÖš&J_ËÆ÷V„©HÛ‡eJîWgþ}ˆòª‘ýd1мz-©8ý,·ÍWíE±Ãå¯+ÍÑI-”;¼ „DwÐYD6ñÊ%”40ÂÌÙ‘JmD×”1Ú‡¶k¤í4™+ÙŽÚ6g>O\âR©µIÖ;ïÞdqãnOyàËÈ~¦ë¢#éV‘”àÕ3U OûæõÔïéø©Ñ•™3C£îª1‚¶ê™e®-°êÑ ;X¡½‘$“sÇJ*+¯ì»Ť i*×Þ|¶Ï_=ÓRô èÝj²mœ¬h™Ót­ªoÁr–‹þSq~fiýخԛѥ™¾ Ô‰kΉåª0%3Ç5¢U¡%{t˜B¯,H¥U…ª•ä5f&'æ3ñß>†ú‘µ…Ü”¹†º†(¥>¥¬}OÍOMaíW¬aõ•[-ø¡F×¢ãxy†*¬+¯¼K7K\º¼Ï¥«WȳŒ×B'å„T¹í4vW:½ŽvïW²‘U¨5É©ÊÁÏoà+ƒE%µúiЉ+a“A€]xWä–®×üRJ¤·ˆèNûœ¶hos9Åg_­–‘EEÜV2Ú!¯¯cGö<Âû_©IZ[køQLfcO:öHôÕ™u=Fo†š1kfË&NÍàžš"Œ›YeV„³.Œ‡m"×+ëÅ¢nqà d2J¡zn…õº9\ '/;AAOø¤»Å gZqúŒÒÌ’€sD2¶Þ}û€÷®Ý`vqÎÕ«™_œµz¤ž¾ÉI©lDxÇçþw+í®'/âçû¬TÔýŽŽŽ¨=V=ô[- Tt"ÿnÒì%Bã&f©MQ{°ùôÚû‘Œ¹¬M‰j‘Ü&“ÂøýŒùÔþùÐÞ06X×¹ÄÝSJ¥ËÑRÒç°à›Ùq3 ^èúê†[BÒz:wëNL)ë(K…®z3õöQu"Y—æ´V}p5­ŒÞõŸÃÔpÓ»ë&ÈÎtÁäôT¶Nb(A7¾âö´‚LÓ,‚×Äò½%o^_±·¿Çþþ>íbÇ× ©Ió,]§„£ÆÔê¸5¿щΆhˆ*Dc-å" Žy%­f”Å’åâˆ~Sê *­›<:÷Mó%kQøÀ£ÓS¬wUðÖ‘Û‡›¤R%f$S»ÎƒMšqœÃÕM‰_+Œ[iûÜÀ™*©¬ƒ::ÐxÛ\œ ¨¨FÔ'[ûÚ†ÿ‡”pÜèm€ŸŸ´¸|ç‚¢²qàÝÓ¦±ñmšŒ[9}¡ÇsꎊÚn@u Ó„yÁâhšsã%ï¾ÆÞ¥Ž+\äÂ…=¤‹FBn:ç`âH(1[ìkü¬Š…¤¹êÁ«K¡—Ëê`Å̓åh¦#}F}ñÚ}š{¾Ï#(8¼nlrÕìXÐpܤÇ×,‰sÀû奵CÝHZJ‹EÊj:‘®R$_wlët§?‘½ÐÛu»éíBÇ"†oÐB"'ßNðÛ‘’ø¶*oík7²Þ5ê82‚”—Ê\¦J`üüæ5ò,qñ‹\¼tù¬ÃÔ"•‡ÐsADÑnøÌë(2Kf°*ó }1–,°U%yj#_LtæŽGÐéV‘MWºûñmèk¥™jN_z,¢Tò¸XÕ[­÷C¸§üJtiuªeǺŽE낞J͘Å1лƒHï¤ôp€C9%” àj|ÛŸigZ-»=A¦çäÖ©È$­©µŽ'ÍÉkrÌ*R —Ô–7Þ:àÆ;ì]ÜãÒ• ìïÏQqŒJÎÀ\JDs-bÌ$0!¡Ô¾Rzcq°`µXEMV„”T zŒ&¼’K:~÷tZ$3>¿ÏÁnW?t^«7ƒ+Zým¨ ·$Ùf?Üf–aZ~è/ÝÂy¾š£ÉɪQëiUÚENMr{ˆè6@ON–•º­sèÖµä|$ §ï’#ðéîT÷$< œ§ißzÁ?N7IÁS±T÷6j‚—¢1L.äm,±¼Y8¼~nž¹òÀ.\Ú•j­¤$,ŠÓiNbʪpt¸dy´ŒIˆÓ™äõõke‹ê…¤ùØw¨¬g¦wmvéÞ¶ÖŒ|ǨzÅ*ýÀB9Cʪ;2•óï厹¦2Ís¶¥¶œm—`OŠô09U2Þw¶.SÛ!ÂKlÒNüÔ:ß:ÕÝõþ·SóSß oïȪ>Ò6Âgb“|*¢ò¡`eÅëZZZV….'le¼ýú;¼Û%._ÙãÂå ÌçtR+«ƒ‹ƒËÃG\Zs#µZ µ¿ËøëSÊM~fH•-"=ÖÓ7õ€s?äȶO-›tùÏÖŠ9’4F2e„Zëè 6­ëmß¶¢ÑyJûAEèíæ÷&Aå§6gg¡vÙ–Ûi*¨ÈæEJ½5.ä–d]oñ´ÁØŽ ?ÅÀh#•õN½‘n ‹\u$*B‘¾i¾ ƒÌ”JBÝ03rvÌVQR…j¼÷î!7®/éº{3ÅjÅK¥ÖóêTz!)5•30E¤-Û:éŠ ’6ës-mÝ=÷sG¦íë+MH×$6·ÒÌ±Ž‰2O$NÚDÏïwu²…dvhwÉ(¡íT<+¬vtiF¢`„Åœ¬”šë$=†‚o¤¤¾³ž'#À u ñÅ[sÕºµ=¢!yg2Cd7µbFG¢Nº´HÅ5€+t²U–:ª¬É±Ùd$š+Iî£@NT³ gbÚÀªÍC²A6gÙ-¨UQ™‘é°¼7r¢§GÅI^ñª™â=š:Ì#êÊž"ÀZÌk“Òt¥tqAI,Þ8¸Îâè-¾ò]x€,F*=¢9JV"ªs¥zBœ#’’eðÔtéšÄ•ڸ󨌲ŠZBj‡¤Ž….!õˆ)³*.'J­qï§9æ%|X%RtµD¶­ësÅ4~ÇÌîÜ©Á)ÁalÞ.!F‘ ÜVÁW¤(J=9úêw˜ g§Xx-;¡Pý(\âÜIÚ’ji²«E&BŽŠ.«æ›€®¡Ÿ#Zƈ`ºÑÈø‰ÇnØX°`'¨(©û’òÿËÿ‚Å,ãÞ£ÖÇ•ÉÊŽ‚êTÖúôâk¶ÁIkÆÊ+¹?ùê7ùñ×¾I¶ŒSƒ4‹ IÅÕ0…Þ*u ì& ­[GG¸³uò˜½÷±ûj%Y¡'ÄöuÎrQ™_}gû³<üâG©švDyFŸg«ˆ¨V%æ|ó¼Ã—Ô×ßæG_ý®½ö*9w/ׂ–‚K¦&ÐM¡¢5äÎ=nÂê®$¡ïƒÔ-.dQú”yãà_ü÷~Ÿ½ž&kÇ¥nÎ^Î$šˆC“J£WÍùú¿ø¬^}ʼã ÿô?¥\šÅn:Õ%wǵJ¶ÓÂ[5Eà ¨E#ˆÑ_¿ÉŸÿÛ?â_ýwÿþßpioŽjϪ+¸*²ª\È}isµˆ—¬9[I°×CòªÒiÆK­¨‚¾ 5 ©5͹ø…OóåG •h IDATòñìïý ŒÔjibtmÇ"×%·ÙÒÍÖšRÔùpøýòµÿþæ/ÿÅ¿f,rýÿÙ{óh˲£¼ó±÷9÷½Ì¬¬A’@m–Ä &­f0“Ã2XÈØê6C3 X€F‚¦Áˆ6ÐÈ Ý ˜›åÆt{ $`@!ˆƒ Á ¥¡†œÞpï={Gô±Ï¹ç¾!³ª2++‹Ê[ë®z9½wî9{ÇŽøâ‹ïCÜè†QŒáôÒ}]Öô‹°5Ç’rÿÞý)ŸÌ]ó#©Œj63œt¼H1V(†³»Zóû¿õF†{ßAa?;g‹5ekH-ìmÈ"ydN‹w~*Ïú¬Oay¦£Ç[Ö ëÔÑ{ËLÅ›áº.,_ÿ~õ~‘&!UôøÁç7€yV€si‡²,hªä&Pá9³þôi/晟øÑì>ãé¬1ú¨'€Üd­®óê!–:Ô…_ÿ›üÊOý wRJ”·£t£U*EB9ZÆ®úU0â[Û{ücxmt—©3gãˆ8Öìôì£,€$QO¸G‡½¯…§etBÆÆÁ%=ÏüÝOä>ñãù•ùý¼á~„§:»9³GÁrfÙ€a— OOÉ›%A HI°: Y©ÕI)ѹt™¹ôÎçxÁ?ý žñ1†itxš7f£R³Ï½Â ™±8sj3¾ÎÍ“áü3ŸÍÇ~ó×ðAŸöùO_ÿ Ò›ßB¶BY(6Dæz ÇÂÿA3µ 1P¼–<°Úç`‘XZE¬Y;Lfõ3¥Û¬Nd]©ì¬ )iS/f#á.Zöáí9ÓgÖ-w^ŒÙ !ðªšp‡¦“ÃnR³¶ ™$ÙXYŠ‚Kæüû¾7ÿè_}OúGŸÀÛvY¦Ýg‰À°ýöÍ3IʃËÞºω3ý;žÀ+µ9k ±“ãZÕ &á€e†¡3Іä¾ÁêtZ«=,ëÂÎ ºÚD!j”¿»4«H)“JµIÅ•²{ë”_ÿfÔH"äÕÀ™ À'}õËøð/ýöÎßE•4ò¦B¦L¦ñàx¸7 Åìu#U£“¸‹î«xŤÁ+’Z& ê‰"WoSkó›Ñ[¨•ý¸xEe{ϺžBèÔ¹°q±·ŒD7¥Óõ¼QXJeŸ‚^ AI­A€à}FÞï=ø´ïø&öðÎXg›NÁ) S™&N-"°®Õ’ºèÙï3w¿×³øœïù¸çIP±v8¤TÐÃÜÙŒd%¤DzÑjŒwmœ¨£!A D²‘¢_£ìÝu†¿÷Õ/ãƒ_ð‰¸öQ¶aÿ±ØÚ(¬ÆçA„K‡{\Z®'°\Ñ×È?ó|z žã´€4*#AêÀ•3Òmš²md› ´½4ƒnA±€ rÁ³S[Vn&E“ý –•µÖ0ÒF ò&â? ê×ûº’Δì‰{Ï$>ê^ÊÓ^ô·A3ç ¤jë°År(RX1Ü€ ÉlQ°ÎÑ.¬&³Ï¸uík%ã*X’Ç%çìƒÓ›5€Ôã>àe ¯ “L‰mRucršmã0VG’¥Ìþ^›ÃœùI˜Ðǘ)¥ 6B´k‹ø„´ÍÆ»z1$XkÈèà…ÎØR7ÄÏ™|_>äÅŸÒ%ÎvŽœJ§±%¢)±V,ºŽ…&¤µïø{_ø9ðîOcXÐ\ìÕ xm´¥JPÄ•äA.¢³Îí¸Z§[ãªG°K€&mðֱݞç7¶òf>\.[×Åå>——‡‘Y5%û*mk;ňÀ+Xðî¼Riøš6aÁäx†A˦¤eÄASàs¢ˆ ±&KEhR)‰…C?j&º¶0GLwTÈ’›wIŠùÝvE h½!AOå΂ÅsžÅ{~ê§CêãƒÎ°T[ÇY"·ø. W}XkõÄõË̪Â,,H-´5%Jã6ŽÏÍF˜Ã£bcéº5‰s;àÝøWœêôÚNâ¾¹T›®H‰²(·‹5$ö¡±n›ªZA<2ˆGŸ”LoJép„ñ¬)á}*=HÆS²#VÈu«¾ç#>ó3¨wÝEç)Œc4ÔZ’9‹¢$ @~œZ+gò†µP†…sæŸÄ_ÿ„粞‹ êá‘á-¸A­dI¶m9ŽI¤4¡Jâa‰EF($’¶âlÌt]ƒò¡BU¸ç)Oæ½^øB.íôÐ$ŒŽLÛ»²w™‹Ë%%%\8™’ÂDpvÁuãk*®ÄÝô³Ð´Ùîô.H5°È‡–Z$RÕFÅ« …¢&áW Ò4§ÛKF#›mo;8TXB¶Ê¸Ž6V¶tCJÚ»Vü­/ûB8…{®Ü›S^2BS%QEZWZ(‚iPÏôkiø]-AòÞàÓM[PtÆm_qÌÞÝS“ ¬¨ZÃd3 ñB/Od4<}Ûïæw=œ[,|G›°fÆÚS†Ø–«±kGG!ˆ•cmß!¡šœ”2Jaž¿ƒ÷üâBŸŽa6ÁÔUÅŠÑåL8Pxá?þH)‚·°•%Á¯ó4U³8Ø"Fj¥‘O¸—lN|Šƒ8K*C+±=1ëjÄ—©ÉÿìOe-¡|,ÕŠ8ö.³·>ŒïëÞÊBo„çJU®2ý"Û_Nƒÿ#f*2QFP\Žh&½õ—÷•¤<ù™ïÊS>à}öK"&Fsôö|ªhˆ$”á4Md«ì »žœ†,$«Ú´½‘ã§j¤qbDí„ïoUc Êc'ð„xžÛbj>CB¾qû6aÄŽä{cd‰R‘Œ©Æpü¬!¢ xÉ;Åùàü®ô¹) GöaM3¦)h2äŠ× ˜zJ\é„wú¨Õx-Gɺ‘¢Ÿ®Òëf®˜0§Ií±m2îææŸÜéð(÷šo‹Ý›2x¾VÿÚÓxê³ß=È Zy—Wk.‡¬46éø¤e+Ú( õÙ¦C~"ª.¸ä†/ž©þÁò[íµwöò Ÿ0…€ñ¹e %ioïÊØ„ vAªÐy›6÷Ã}5Öw‰°êM"e¡å&¸j­ÄñZ<ðÕÔ4·< uÓôñk6þQ“ŸðOšFn›‘cä1*ã);¾½áaÄ{í>‰~&^ÞàbÎÞ[˜”Í‚N™;>ìCyðŽnʘƺ)Ÿót:æ$$1–µòÔ÷~Üy4‘Œ©Œ²´Ùƒ•±3ic=­´¨`ƒM]aTf#µ©}ÆÅÛ¦…L¥qÃIé„ç|àó(*hJ\><à¾ýˬ5¦Ctîà%;è×VÕ°#Éž¶Oµ\¯X[…æ‘rU3œ£Ì-þº_àiïöÌàbA‹iÒßlWjÕñGçXÑ[=¡ž@m2šrªWªØtÕ!ymÏÍȳSh$jÏ3¹£9–(ÜÆðË BcÍK µž”Ø}Ò“›¦7“ðèîb޶Ay÷˜­t«ÐeÎ=ù©á«BŽ-¤ _œ•à̼5ÆqGítÓM›•à4+Z)¼ÕTØÊ([ ÎÊÓÞý™ *Ü·¿ÇÅå!t É)FáÜ'ꈅ!0B=þ@Ž”µó’öÒÁ.¯(JÐ"ŽÈU=Þ²©¬’’ 3fÃ5š]Ѝ-qù³ŸcU¸ûéOg¯®©‡{¬Åqí(ë® øÙ¿ûI§´9å„Syü÷¸°¿G-Ι»ï ²ÙÀœŸ’íݪ¯¡°Ïô¬6Ÿ¦¨U„¡Ý‹~]xý«^Å“ ˾¿z¦<Àµ™Fàøu­E2˜²ü‹¿äœ9â†KAµ§xˆ*h“3¡uÝRN˜\椢¢âÔüyÙ+Wñ@¸ðn Kš„’»Ü²Áaxå?y)g‡B®²9R[) MM9±f`owÁÿøå_“ÞóÙ˜AXPÊ(r+ »НÂGµ¢¤FŽ=–åP›* H·ˆñ¹Á‚@`=›D˜Mb5­=#™ñ{?ù3üÁO¼Ž3Ëu£sXe·ÀAv, rçsŸÃGágÂî‚bFÖYp2¼ö3%ú½çK¸»ËP Z”#7êÂX–¦ñ+?ç9ÁwirÒÂð.s¥Ôý+ gvXxD§­,O¶@ù[ùµ9:iTGlUº¤€6E“ÉŒßxÕòÌ‹û\îns,63¬öÜpëQïH^9K©ŠYFæš7¿Em8‰ÄʘȆïªr‚ˆÀ¨·7}·ß±Ûï1x«$M¡^¢)Rqþü¿Å«E ¶~Uo¦4›z~©Ü{GÏáåË1Яó‹;¹M ÄzÎd±ÀÈj2i@¯#†ØU›&jÞ©Ž»Å6ßàWÐTH6•ëÔH™.•½·½·ÿÆorÏÁ@é*]PoÎUå õtƒ!žÙë‡MV攣qIh¤ c]Kv‡J„z‹=Å‘X9“‰-?Õ~û‡ZK‚Pem†'¥¼ýÁ¹ëÜ9BÊÝãR³Ó‚Ó Ù&¡>Žh P !“󸔜eZ1Èa÷êŒÇkîMÊNÚAäX©Ô4°ã‰TÉÆ²ºäR©A¬á°ÒÖU‘ /O†sºylÇ2º[çõ„ÇðŒp®‡^Së°è€éHhb’Ö¨"3lcÈ•BS¹h¥zô±œhhXïªãíž”™Ućz—Ž*]ëÚ*µÑ:½õäÚ:¹)µi[=c™Cþ®qžÙL°<ày Ô¨/¨ÞFÂÄQ]¶ë”£5OÝÜ­2S kÝ©ÀO_ñi*B4ø„1 ”Õ6Öfàåx «£Ã&ÓueRdéšV›îö/ò€Å•lJ_C (TÄêÿlüA·ªT¤YÜ i\Á‘Ú¤ã³'A¦[¢ä*ís6É1‰L1QIná3K5j­ ë¤MóHx{ÇN݆¾PÄÈi‡2& ˆH ÈÃc$³jx w–8;„Q»¨Su@´n´"=á’£»;~ =´‘­]Üôøó„Ïð‚;·¦yLH„üNF¥4G4æ;çØE©{GŽa»s5©*OÆàíy§GzR]mÌñ&íö“ÆŒFYûtõË|hÏO•/^`÷<ô©'w)¦UšxAn žcÙß-bº5a°I#87Ò÷¸«Ÿ0ZŠ4@ç=ÊNغûx£e죡­AUE°…PK!™Ñ5Â’qÈ:ˆR^Ñ*ÍÓ×Ñ"®AajÕ„úD#R©¨ÚÉ4eÁÌ”êÄröy=áÞ€"btY¦4#¹Ëø0“W­5¶ƒŽÕÎz3ÓnÝÝ1ØM˜ÒÆ¿'þåÌŒú¦vo¢'a;"7=>ÒRG¤‘Ž›¥R5sïÅ‘;ïâ\:ƒ«7ú…] ¼šf%>åœm:a×Iß§µ±:xÞg½˜{VkJî'(¤óËcPÂSçBßeÎ.þâ¿ÇŸþæ›ñƒ%ï „øh•J5#£Ô2Ð- fMÜ35 ³ø)I”*>n‹íu&·M|néWbœ ]¶IPÀÀJEÛü'Âsí/'£È(þ92þ›@ ÇØÿÓêu¨îô§dcêL>üz2¿ë_LÂzŒìî“>!'×z.pó¬1ibp§$ám—/ñÔ;…AÛM`vÜÃÂ#ÿ˜ø’锩Ûzú1™2BmQz ²o AÛ}ÉgT`‹‰i'UŦ¾VçÝp>æâþ쵯çµßû#èŸý1fN±ŠäÄJŒ,™Z4…˜ªÜIkÁN]È6ƒTÆ{y‹SŸð^pÁÚ º1¨‘IWkp˜bIðòÛñn£_MAæBô!7œ$fÍW³>õk²ÑOrà¹<9PÕ½Õ)órŸqê^ã¯è¬KãЦ0¾U)<^ ¬'òk2 IŠ+ nQw]K b‘ᩃT![ò]q*–2Ò†®Ót"ûʧjóh` ¥<, ìXÀð‡ÔÅu|û¦;ïÔÉi‡Ì‘Ïc%žð9¬zË&ãÏM"èí …5ÑôÉ·°‚G¶«ÿï&lï6Ü,ÅÞh.åó G‘6&¶=66]\6ز´î¯‹â97…Øžç~ùçð?üýø]÷°^©6ÊP{ŽQÅФ×L[ý"¡#¨³Îøí oôYõjȈô©ÉÁ’P6QI­¬UÌR@ëj1{(á†P \¼±‘çáb7Bndðõ6uÐü}Áð(YxÛå \X­X[™  Õ­æ–¼é—~ijÆNj}R§éÚD44?“ï_ªÃ^y36Ö¸z©©ù(Á3X5‘€‘<ìÀ¸Â.ò¾ïÅç~×·2<㩬Rd‚bqðý¤n”­}”×ÝÕ–Ö­Iü~ÂcxfFj¦ÑÞ0 è•w}¿÷áîU%{XõÕð˘¼3œ»WÆÛ™3wÝm,MmK° \¦În°wÀo½—;oz óüCå&t $¥0jRõ*BuG’pÿÅ ¤'=™ÒKräpˆ¾çc»)ïYoyýùÅnDèŠñ±ÛbmMi“» Ž^Ô¯eæ6Fl¦y¢ŒRõ­Fõ;;ž&Ý<›OúÚ/åG^úrvÖä.q 4‡æ¡mE5’L'»[õõ˜¼âŽªLfÙ:³bª­«9zTȼ"¼A÷4iÞJ’&σÅ/ùþï~s\Œá¡ãgN¥P«£©k£ªÁ»»ôæßáŽåIßLO­U'IžqqK˘ÉxÒ¹›ì ì ®³IÇ –ÖôÞC•Uà`ÎUá\3`ɨ$ºÆÕÛÔ¯ñÏM&ïuèD()<Á"M×­ÉÙÚj^Ûµë†wwµçÚê9m“¢J¶*1WšézÑdJŸ_ºÀ® íºÛµÑLZóL/ÕÌÞÛïã-?ûÓ<û…/hcƒm ŸF«i÷¥2N«X fÐÎêP#žÕ“Y¼j¸qÀuÄRU0*ZãÐXjæéÏÿhÞç·üÔ«ÙɳYn•ŠˆáÞc² Y!5v¤“P/ÓÓÙá:ŽúlŠÈ==f½Ûzx7èªQwÊjt”Ò'ð&=ßÒïüÒæiå1•šðÝÜæplb6¥T}Ú¯^¨ÉWª+ëžrøE4¼R·4®¶Þ¨3]æŠ(W­ëÇÈv=%7‡±«dðËåátÿç »Þ‰ÈÐuôËÊ«_ùƒðÀ夵ŒZ&ad!îˆ×…rBT¢Ž’%Òþ3?ƒ+Rñ”ƒ½ÐnÔ¼WfM*ÊÛÁ:¯nÓRþŠ¿*IÒL+Ǧ¬e²µiòÜ9µÿ;îç?÷:þúá>WNþ>©ä9yK×­²B§Qf2/w<õ©<íyïǹå iÝL—LG¢ÖU˜.£ì'å®g?+DMÃç5oæ#OKˆä$›Æ–æŠ:*MzŸmŠGì›òîÖ½j#j4Vm[q(1Ê·UÒšÝçý~·æìª°{ïÀÏ}ÓÿÆÇ~ËË)ý.…¿6 5Ÿà—±ÒÍm û)8î8«S‚‡*˜Ü…œZÆ•Þå)|Ð ?ž?ø‰W“‡JN™A¤U̸zÌ‚ñj†Ü"$ÈÛïF¥È2–:ý¾`!›ÞºÀR€Áxí«þ5;eE餯ÛøVTÒFVNPÃôqÖq›š_÷™gÿýðì¿û·Z°ðÆ™jºx©l)ªsª¦Ñ!qÄÙþÞãˆ0hó ‰U­2»##7Û9ò½N³„N)mÝ’[ý_½pfÑQ‡Âÿò/ãßúm|Üÿüe°s¦¹_ÇŒuJÒ‚œÅè¡ËÖ3ß’;²â1l²êÁ-ºµ£ˆl x`-Ðï&žûü¿ÉïýôkèaðÎâ¨TÏœãDüžïÓo¼ÇýKNØjÍî¤,ÂZ‚#¿ãðàë~‘·üäk¸£Â>£¶ÿ5kÖcÇ£ÎJ¹$­¬ec¹ÇF|6Œ|´ß”84§Ê¹æ¶i r՜԰ÂM`›q»|zoÒ“ÍiÄõ,z¿z¸¿·ÉvIËIqà‘?»îØO`©çüZøË} ¯ß/|èK¿r÷ÝGnœÑ©ƒQh3¸r<à9Êà…Nrdhf JÇ&k/£4X5,+K2Oî{Sšš3RaA‡y¥æTÑ9§­¥¸ÅWTz¬Ö˜ÏmE(x5$5ÈÅJ³ÇlÔ•»îb÷üy8¸pœû©„…h“I3½ER·‡[‘Ý~=Âx'vꮩM>i1ù¿ðƒ_üåô÷ÝGÊNMŽ MÅÃl[ùx&5ϱ“ÛNÞðG°µÅ»…®¥1 VðP® wƒÊØçã–5ÕO?iÌöMãjM:€íôè,½­2ß7q¯e¡ê1x?§žÈ-¶?Óº°,K»BÝUÌÖìšáñüÄWÿϧ¾„·üÐào½72x •£t¶!¸Ë¶bôÙ¤BµJ4ªj3•ò#ëc¾Ôžñ®ïFñÀ`çØî#±Ù©MåVw ¿ngx׋ÁÐLq&”ÍÜð½%¿ô?Äþðò¤ýCJªîfÊ`œ­Gõÿ-”d¯òÓN¨©§Å>6+¤ tŽ^Óh›QÕ5oÝÎMù7ÆU%Ov,“šKx’ž"H˜ãØe½±çí‰çŽ9Õêñ³ÁIýúº³$ ©€2æJò®°þƒßáM¿ûÛüî¿x%éÜÜõ¬wgÙö×K›Œ˜¢Løœà a™”KÉù¤/z ;ïõ,¬ÛÈl¥1Úåö l.HÅ QEÓ¶„VÈzù£>Žòº[(àE6`B¯(ª!X8.DãVKQoyvŒf›ÜkÓcK_ËjH¬{{ê"2q£òh"ウ†ß ,ÿâ­¼ñ?þG~ùGþÝ}—xç3w³ÖE˜š®Vt*¬;'ÕÜ|t ‰Ú8ÏöªJÛ%t“ŸW¨Gí ™wçfˆãTöú\Ö§YºO¢³:fkdnü>k „°K»€!Þµ¿<´”0Ïž¹œæqàWoQq'|t@kfBí^%:±kðÆD Ïym–FV;hô4~/›æ½yí†ÍdÐz«Žù{pÊR ÿuz³&N­B§ ªÕè7 ?gpPszQ°Ù¶¡·VÈi«ZYû@ºr?ïxÓýÍ> < ´y)gsÔ”Aoí»òbH°n=Ý\bç/ó@æ¤ÛrYîkFöV"ˆ’èjˆ€Z\C¹«¹åz­CÞŽÃØPO—f\nŽÉÐVÝ{<ñÞÕa½ gˆ4¥Yi¸FšÊÁ¤5اÈ8„&µ%‹‡–˜üðW| þó¿Â™õ’^+’2+ »êPœ.u`•T+EÅ9JQÄ IDATGàaË(:Òc˜É|ë,Ò‚øFáÅi®c¢ÇR(»Ú½”Z8M¬óÑ(yF>ž äöU¤‘‘ýªœÀ š7!RMÌãšSÛÙñæ "Ðj3éöf‰·1·_4E3G@41XÁ=”„C8ÛÙà Zé5³ò’Ñ„ …] 'eUVa@óÇüÞfŠ3‹²hDmc`Î:Åî Šw¡nŒÁŽÔ&EUHÖSOR7ã8ŠO$biÃõa$§?tÓ!µ[ÓF~Õ‘™ßFˆ˜¿¯;(l6ùÈJgB·N¦RÈLªC[a¬†þÁç«Îš„°ÊBÉ…êk\k)+-“»)ê©øb¬)—‘,ê¸J¼§Q: b*ñõDßÃIm:áè{®È¡',è“6‚ú#ß~Ÿ?T‚ëµ6e¥Ã%AV °ÂÂy.%ЇÈWø˜ŒŸ¡„¢°„BÕBÕŠkÁe4‡¾F6¥(i±Ë(9ÅÿS¦H¦”$½Ã™.HvUX¤L_=ÊVÓ ÁÜ­ñ>èYöKÖi è€Q[S!pàuñø|" ’"XŠŽÎÛdNÌV¥T£R¢â9&|w3Gÿʼ±«xµE}£FËPÇlˆT»ùÑ&‡Þ”õåË͆1ÔcG†ÃƒzÒÆ,N}8ó¬ÿŽø%/áb 74]’ Úeªª¼¦“ŸÅ®ŽôÜÛl¦L¿%ÏS[¼c“†íL†ó×zŸ†-^UnùÇðc‡¡œØÎÒÈ£c°ÃÂáœG-[Êš¡K&g•ŒµZ8²á`…dPÄ<¾v§àqª8޲aÝ%\…¼Z±X®é½ Ù)eI'@äNUv,ÖüŠJI†—BgÊŽEäé0~J„ Ò¹•²X ©&’%¼MÎ8йÓçQ5ôVl69“綘ím}ä:.vl¯É)Ùã!Þš%­èçj|s{¹Xõµ’u6>³ŽSþ[_ú¿ðO¿û;!k³$ŒjÀgÞ´£qŽkà#b²ò¾Ÿòbþëïü¿ÿš×rOîH5QÝÉn°\ƒ*KIîðYimèWdSÞ¶?”4k<-‘ˆçL¦ùªÁHˆˆ]ü"ˆ:n©žõú0‚½Ÿ4·7ÚVÉü0"ž‘£iS[SG©KôÏ{/úŽWÐÏw¢æÈ‘ƒWI^Ñ6I Bgár·N‚Yåð¿þ¿ðíÿ’'Ù 38LŠ,:l=|éz\wXa1sGÕJ¥º“,m‘J‘DAºÑ~1ÊÕ¾Ý×bQsŠyБ$‘Æk‰È.E, ÔæÌGó>>•²Éxž·0ÄåÔ©»ðŽŸÜ#€nRI£CõDõÜëOó Ng*‡ŒiÏáÀ_üÖ›ù©ïù>^ð…Ÿ‹%Ç›¥c›É.Ÿ9¢²ñ5Ve…c»ð¢—ßü‡¿OùÓ·bUéTPÜÖñsòj¹þ &§9 ¶éøÞ$€¦\)÷Á· ®çßêh’Ó³8å£}s 2ª-0si;á{§“YÊSßÊø®Ò vJ”w bF’ОËçwx—~ÿ­{:uÂg›?n´?¢Ï™sÈ(ÔE+H­%¬Ö¡Ä¼#‰ÞžL÷¼÷å¿ç,wºtê4 ŠÈ5Ÿ‘@”F‰²«eýµ´ÆVLQ@hÏ£6›ÍñðQåo»—<š¥Aìz÷µŒÜc7p{Ëbx§I–MñÝ3eó½òdsh…n¹â5¯ú7Üÿ_~ 5g˜Up¢:á^ñ{5¼BF@Ꮃ|Ù7ýs.v YdÌL*ƒ Å*y(7æf7FÍm×.ñØPªc-QÐO*IbÎr<·8}ûk9VÊØ,»óGTfžZµñÑkpÀÔ¯½N:ÏŽMkî䌘~TDj£Â)Óá“ðfü–’=“\ÈT’v$Wz_ U¹’V¬Îidc@W Rs$ yš‰‹†Gž»"…*%ø ³ë«,Ñ´Ê †Z|¨6D§~voGL–uáÁwÜG/ÛÏWæy ÿ÷¢ÌÞW•ø¿á=D\ï´,ïFD|Ge"áqu$8çÖ¼âe_Å7ÿøÁ=wSdsÓŒ6ÒrJyº©© –-žûl>ù˾€_ú®ï礒jÖÚI˜vûõ‘Áü( e*c7ܹËù6îÛ½ÔRYhóQ;Í­ë\%Tlwï<Ï3žó1«9ùÛêñáôSâÈœ×w3ˆZÒ,=’ÑêµE™Ý¿<’JF#'GIÁU›ºó›*@gÁ5nSlm^¨§ ì(‰¥2À"áu@‹ bXîðŠìï´@È=ÅñM‰ÙXJ¡yg͇…fˆ®›¼eº¦ø½éß¶gt“ª&í8í¸=¸÷/I(V7ŠÆÒÄÍndSívÀ›mkž¥›]œtBÛƒm÷^l{O·ïWĶà—nnq@0Sy+C|²J;½¿û¿N?Ù»˜¸i͸0±Š’¾³uaÐed›ÞF}˜ i$L3ÕkëëÍ©xjœÅ7•›[nÉröjÚ\þ×&ã2+IýM°…±Ééàaf]G›ÉwvÕ·Ïõòµôˆñ¶ÒTEH„&ßdÔÍ­í±p#¯_#ë?ÿ¨ è£@…|»i€ òßû¯Ø] ©,SÈäG“$µš%*ê”™ ¿·F›…:R—yŒÐ½[·K;ó5•Nõ%%üt-V×xVÖbP éþyÅ—½ Vµ5Ïêäµ¹£¶ ÏÞ¼ÜAïþâÀS?æ#Yïîrf}sËÙ­@'r­éaaÐ[2ß~õ?¿Þìqþ™æ’YO˜LîjÏe^IŒº‡Ñö´Ô%¼|ÍŒõ"<@vVÆú¦o‡ —È}Ì « ÉFdÄ@ô„f›râ¹^¯‚ø®çÖZÇP”ë– x©™Á0[Ìóº5Ò~ƒOnßÔ¨ÍгR;e)ŽjâŒôȪðö?þ~ú»¿›ÅzM׺»”QQÝš¼“Ìž»#â†>ñ—}9ùiOÇmqÓ2å£yä°Ü©Áï¡,¦-ÿÚG ÃÛbÿÏ3ëù°·×ÌÄ’¦-jR(å({Td¹æW¿ö[xÇÏ¿ž]`E”$»–I¦Ôæ ¥íß׿‘!ׯ†¡ ÚMô-I §à«'vI{µzÎÌ—dnĉ^e3/vBBŽ55¯ŠWg7ïЭ^óÃÿ† ?ûºM—#,,E$TOBh ‚ú4£+¢pþŸþ_Çß}æ–¸¿â~]Í “JÆ1ëÒÓ0·ëÎX秓Ͼ~b½„Ó9«ãLtµÚ†+|V‡K÷=÷_àÿþ'_É[^ó:Î+ÄœBÒ„To×{?‹|éçßü úy÷z3f½Êó9`çÎf78Ëz–³§Î7ô!·ÆÁDŸ®ÁÑüåŸ{ÿ×ßù\®üê›ðaŸ¡wªT:TRäÕqñF/ª1Bhàœø5E!–ÀÕøj—£¼8‡>wÜô§vKððFi"U‹ÁlMÍM¾©Kœ"€ÎI°ç×ÎåÎYv«Ð•Æ»RpÏdO¡mHL„iIU`ÇR:jSšèƒK%1$¥/Nï1…`º!)ï?pøò¯áeßûÝÐu!©¡ R,«™âFJäÍIv'óQŸüɼùg~ßøµ_79ÉÖ$ 3Ǭ2 =uRêpV É¥Mé]okS“êšœ”AzÖšèÌè}`pcÙÃbYH¹cíÎRSpål µ 93ãß3@£äF×N*”î UWTÉÀY²UŠ$…µ «à0”ÂŽeÞchCÞ(ÈmH¾ñ\”9Á»N–B¶DòPüÕBçÏD¬¹ÃéÆÈÚ „w.²ÂX!,&%Ô”oÄÙh™>{³ Ép”à8.ja+– ­±—~x¶nŠÓJòpÁ“ÙHö+^•ùˆMþ#5xî=2òõœŠï]áÏßð&øõ7ó{¯þEìþ hZïO2A—ù€Cë¿m¦:ê´ïZ‡·1ðxVÕM†X!{f•—×…U·@ CÁ<¨ŸVàÓ‹JÿÑ:}Ú‰Pþºx¥¹°Ú‰ —›‡ÄnuãR+Ù¥V4gLa•Z§À*[åÓýºä\êéÜIV8£Š™S)HjjY2JSuçÕ×X^P†3º¬Åb`<‰à¥à]Ç’¡ó‚ KÞ~å{½ÑµÁrZÖ•=Ônc1FÉîîä¾g¨Õ„šÒEkÇJ=šÊ´¸¡6„jnJT«Ô<6š0Í+U3«ƒøœ-s­fäœ) µÒu¡éÖ ¥u¼œŒP-GÕÚì}¨ )G<'C­jBvÎE€†¦®³ŒjÑÎ4°o…ޕźÆçé—|ÀEè\ˆÓëx™aÜ¿ºŒ+ÜÙíÆ˜Z]Ðn<Äš0§c'÷¨ñÜk¬Õì0ˆPûĪ6 ’[kDQ™Ô•J²ƒÞ¦²rC댬ohÆ=Ò&”¼†Ç‡W!-vYeƒ<8#Ò{|Y„ê)°®ãҥ˔2 ½bÕÉ’±UAªø»°óÛâ¿pÓ›G·LÀ;*ëãe›¯Ý6±¹LÔîiõ ˆ,.YdVbÐÍŒŠq$e|Ô0³qß89å°µC‘¾geCH}ŸÌm#àšƒ")C1:MÔRI’I@œ^ÚI.ÊJÖ”iJIî,ô Cu:íÖÚÝÜ#¾¦xÔIVvU©f¸*îQ€OPºPí®¯6M¶Jšb±©×ø{í³¬l@“²¨Ž'¥¸GybFBšÌ~i m|»Ô²=PKTu»%9+ÃjMÎ’u¡¯Qüj‰C¥˜£]ÆÌXhjS‚ÎZ…Π+1 U›jïX² ¶¢ ,r<ójk ‘KåŒË¤‚@QE]É}m’ãiVét7®£TDìZ¢œUw}ÓM]íYçȺ.ïíÓïgÎì²’Ê+ WvJ|ÆÁ+5EÀ/u@úŽsëÈ—âT1ªU²(;)aÚA›ì<£©v#þ"´ê,صBJšUŠk væäÔÞ ˆç »nWi\]íHj ã6Üc²c°J͇C%ç\XÕBJ‰reíÅàKy§Ÿ}9Ï¿¸átŠÔ&/4jŸA/›±NqÊâcY[¤‰^Vkž‰2TvºžZH™e6a½.,R ˜Ñw;!±Ý&®ç]aŧ’¹(,ëÀùÜQËRÆ,DRSSN¨i-bf1›²ïI©´¬ ¡†ñŒ*Ògl£9üå…X‰Ð{b±J¬ºÕ&Ûe[þ;9ØPXh,B¬ù¶ä„¶“¿RÂf±©6¥”‚‘/ÊP×hNááA°ÒôcsíZ­Œ¤=Õ¬áPƢƱ/"X§ )”úÔQ–kvºŽ¡l‘²Wª¼j]c÷‹–+¦MN*üD´Ë”R§Ö‰t³Ì{Zù­E?$‹"8}VX—Úðý# i…˜±È¢ÆÅõeJ.œÝ9Â0GZt¬ªÍéU/pY….%ÊPè5“Í‘b!ÑnBJ!b ¾u9P´ .Ôg FìñïR‚ò5zŽx]mò‚ÝCÉ}USEj øWCöþòÁ’a(˜…ÂöB3Å*ƒ‚®ïäoÎ>!›ã;ÆÄ39ÙÐQ|†e(Â*7{jÓ¦óVzåv&$Äk¥Ï‰õ°OŸ:¬,qÔ`7wÔõ’ÝœcÈ»$‰ 46)ŽBŸÖÊíåPØ!±“z\…Zc³…„”O¶‡É7”äÒD™rµäZT:rÎ nXÊdIØþÀÎbÁŠÊ;.<€:œqGMp/ ÈTf²Á“ãÀö˜¬ Óçž¡”arónÁzÈ)úµe4¯Æ¢;K©ÃÔÙ•™b×ÊÆµoÞrʨ…êˆg(»¹±è2«å@U…œYªP“²¨á°Ö,ÕFc§¸G dIÔa çDÅBP´B¶BM‹S;µêF¶XCª‰êurS[Kàgz½óÌM†:T<'ÝØ?ÜãII8×í‚$tѱg…ÝnVb™óíÈ +kvsæpX¢‹Ž"FòJŸj¡HXŒ°xÂF !ú¿ œ¹ 30siÓàª*ƒDœÌ&ˆé‘:f‡,u@Û8%@J=W®\¤ ¤œ7ªC©\òâO¢û]x~Ê6à]õ™Œ`| z›’"”Š‹FsbðQ*d#4¹¬}¾•‚t)|–Tè5NÍ"†õ¾ hJX´vÃ×ô˜üŠO`rø„Rš†vß+ë¡„² Ž[–ÑØD11HŽW…’îº<åàA­+½ö ¥pïåûY+¤ä¤ê¬Â>…;j&¹OAiövݨ[cÜãËþåËàê’cªX©,r4êc“¸Çu– í~œõŽe]á9³º¾‡2Pª‘S¢º‘’RÖ;š¡Ü±õÀ"%öUt,É7)⪙R ªBµ0T*uÝ:ÖJïÞ®­A ŒDëQzßéSf ]îYñ|ÏÊV…¡»N(¦6W߬T7z”$pùÊzÆ9»s†\*w øò°É<Õpå딕D‡½º“ºL ‰LVÇKÅ’†Eëdçq}‹QÕq·I1F[Ö-m:I=¼w$”‹U$…‰Ï8ø/³ðˆÐLI!s&†‰âž8\­X.\…Á+b¡êrpxà—låïÏîϵ`7ÜxG¸x&×ðí–¼oiÃü£ÜS&i†Ò´ÄMDžœåÂÎ8Q=(á}äߦÊZõÒL°Jݬî˜7÷Â?%Ô¤V *kfűÆ#1¸ž¶M•v`·^‘¹qéÊåf‚ö]ÊÑÈ šËêKøñooÿ|ï ðšMCežA=@…Ö5ʇò[GÁݱ•I›‹0,'•G—°ÊÐ8Xõ„),þ6FsÚ<ÒFÔwÀ;e¿â…³äðMÈŽIPQ’ÛdXÅ01úâÍίQG ÉÅ;î…uJáðš­”Zæ×>Ó¸&ÒLeTFÀ#>cý:Õ¦/×ÊO1âz<Éu“ÚW9‚ì(6jϹÅ:zÇ• Üuþ<»i'®gR4i~£PÞ`´â±2r‹œÑùÄÛº¬0)g³“Yf^gäÚ€6š{Öf"NÏñ|̸[ö<6 Uuã ð+n·„¯6¾÷åú„ x'e>2kRÈLÇ-¶¶&…íÀ¦"Û¥-'«úÆŒàõ’ ÓlƹwŠ[›ÿfºa'™‡»Ê$Šè"\ܻ̪¬©ãHÝ#Yô7|¸ž÷ã=^Ê©Á.Å2á‡fÆÞÁ>Ëå*(M*QÖΟñìùžZÒ>Â5Nt~=0ÏîtˆÝ1t”?àГX—ë3ÔJ:4_Vì×àß½FÀ\Xû×ÿû¥|Þ‹n{ZÌÒ|KèU­Ìï‡OOÉ y”¶˜µÅPÝ©I8¬ë­EV: ê¾Éú$0;OÊ…+9V‡x÷íÓߟÀ —·èk´ê´2>i³¬£Ø¦¦˜Û¾tå2ëeëjž±yÖþH²»‡Íɵdf&.¬´n¬ORñ)%–ªüÙ}0£'3¬RîXya9T_¯  ?ÆŽøÏÞ…ÿQh¢½Ü•ÿÜþvÀ›„é)M·ÊTñé¡&!~Ri{Ѭfæî”jÑ Ëõ4.ÛQܤÔBU¸xùRpðØL’\õ4ÿ+Ó4Ç÷ûh¢zBÉ[j%§ÄÐø–ÓÛ–<Ž­÷‡쮲ÒzJíû :QÅŠñöƒ}..QѶn1Ãß;Xò6Š,ïô¿ÃáŸB]¿]Of”/úºƒ'dÀÛJÆD¯YòŽÙ›Î;¡'ŠPÊÉ)ú£Ý™9ÅL¡ñг±Ôu\ÞÛcUÖ'기6ŸùÑÕ¼ýºqû”ÒqÌðrJ›²7)—®\¡ÖP09–¥Ò‘·£ëê*ëùú‚ÝÆV\›|››ÅÊz9ðŽûîã­—/‘ò"à – ƒÅr ¸ùúÿ~ßú­ø/”ßàÅy9ü(EÂÙ¹Ùé±çá™Gf4Áv•œÔ²¦ê8û™’yó:‰¶&&“ÅàèãdR›V—o|u<²ß­ªp ƒIDAT¬¹ø€É5p’kÈ*ÖL|€Ré‰é‚Ë>pGß“k¥«¬ ï„æ Xîß»@µJS›uÃL®†ã\ïþ«_ïôX—ù~r¨8éÇ@Ìù/ñí{¹çü],r $Ó˜”õ ®Ây¹ÎîWbôÝõëNYLj@.®#3´h“½´Ä"¬ÊSî¹´¸ÿÊ{ëB§ghBz¡ÝhF·¬P»ò¯éÿŽøë|Ç…øzÿº6<%Ežh¦_©ñÇìMSÌ¥ŽJWT`F0AÕcñøQù¨íƒ×çÅGVèIÖšu~d_c?å±ÃêMòI$ʇ¡½vPÖQÒZÂ|€œ¨î\Þ»÷£k#(Ì7¨«g˜×ç|–ëç«^7@q½S®+ K† {¹ûÜy]OÇ@IŠKÅ`¶ê[À”±ëŸé¶‹õ[bÔ¤WÜ¡rȰ“¾avÇ2ÞÜ€ÇïqÀâ1ýùfq_¼r™»ÎÞÁ™Å"Y5‚!hÓö³Âáá]ÞQ ˜îÂÿßÞùÃØqUqø;gæÍî:‰â*H @¤I* 있6„P eÒ¾•#]E šuDƒ¨(AK$U„ (XIH¼Þ?ïÏ̽÷PÜ;ï½µ×ÙuÖ›µÙó5Þ'yß¾™7sæœsÏýý¬#Ä€ ¨fç¼51TDÐ&å÷·¸±;!ê©¥!°#Ù—ù¡I¢›`áó¤o}Õ¾ð2l5,,.eo À+Ã…ÍSðRJ$bV QE¥¢ÒÙv…<§—zíüHLŠÑG¡Ì©Íò>‹ ¥×ŠHÒ¬å–ȴߢ£’÷@î§vØJAÊÍ,Øi€)E‚A—$K€«×÷ŽñxÄ8´h¥óŠò EŠ;>©«{Œ\ÒÜß­±3];êdà gˆšûzšŒ­ñPÎ,¯R*Ö寤,œÑÏ}6COXÚûˆÌ ¥„`­•ŠÅ)ªÜ"J¨j5ïíìòîÖIÖ|¬u€M:FÑÔdwdÓQËÑžàÌK/ðÎÆ¹ô0°5‹3FÖ’ ¬ƒÂ»§O-EËüY²ló+YBÒ|jÒÅ;3íq¬¯DV±Šÿ…±¨rdÑ Ã$ÐOzôIE2›yg&ØÜÙ·:_„qá=z—¨˜²„“T Û£]ÆÓiÞ̘TXú>Ù]ÝðjéÝAû~xíí¿Ýõ£îaqi J¹·W))F6GÛ$•¦ÉŠßºW" ÙûyãAÇ/ûT+³™T0 Y·<¸U—ˆ;]`oßxŸq×ñ‡|¾šJ!t LéXÚ!ã oÂ'¨ò×~&L>µ•?‚´ù^1Í¢¯40 &«£Ó×û…³¿ENŠjbêË|Ûs‘Í÷`§=7¸•¦eøWŠz¯Îy羺0*’aU(‡8™ýÛ bLc¤iL-1h§Y‹ÎÈÞ‹Á;ÝEïnpÓ‡iÍÏd:éšö¨¿Ò%í{¨!ÑÑÕ,ÄÙÝÞ¤~äšfiAýeá©»G©,Ð2yB°p÷Ãý&UeÈž&“iÇæhÂÍñ„IHU£õb¤Ñ.bHØ@˜îîr¶Ø¸Î¤[åÑo~7_»¢p^åj6ŠÃ”È„~ç'Úü¤YûȧDN¾¤í;žf˜(1–ò0g,®_}Låû :ÏÈzQ¨~³Î\Œ£B‹A󹸅 ™3DJvY¤°ïòLÚ/|Ù£"Ê–'Ô]JtQØ -Ó¶+“õJ°ˆJÅÞk¹t ?dy{”æõ‡þþNÀå§ôcâ¬6«l(¼Ù¬Ûã#¿,çøxôÉ… •Å×kbÀ…Zxe²ï¤ÅÆ35«põÅšsÏŒa kI°+ rarê2<[(g1kn x {í <x¸,-fÊåõ3¬®µö€=!çÿ+”<ÿ’7`ê,I°ûaá…öÕ⿎ã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žã8Žs<üíc%dK’Þ IEND®B`‚sprockets-rails-3.5.2/test/fixtures/manifest.js000066400000000000000000000002561465251666500216650ustar00rootroot00000000000000// manifest.js //= link foo.css //= link foo.js //= link bar.css //= link bar.js //= link file1.css //= link file1.js //= link file2.css //= link file2.js //= link bundle.js sprockets-rails-3.5.2/test/fixtures/not_precompiled.css000066400000000000000000000000241465251666500234070ustar00rootroot00000000000000.not-precompiled {} sprockets-rails-3.5.2/test/fixtures/not_precompiled.js000066400000000000000000000000251465251666500232340ustar00rootroot00000000000000var not_precompiled; sprockets-rails-3.5.2/test/fixtures/url.css.erb000066400000000000000000000000651465251666500216020ustar00rootroot00000000000000p { background: url(<%= image_path "logo.png" %>); } sprockets-rails-3.5.2/test/fixtures/url.js.erb000066400000000000000000000000511465251666500214210ustar00rootroot00000000000000var url = '<%= javascript_path :foo %>'; sprockets-rails-3.5.2/test/test_asset_url_processor.rb000066400000000000000000000060241465251666500233330ustar00rootroot00000000000000require 'minitest/autorun' require 'sprockets/railtie' Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) class TestAssetUrlProcessor < Minitest::Test FIXTURES_PATH = File.expand_path("../fixtures", __FILE__) def setup @env = Sprockets::Environment.new @env.append_path FIXTURES_PATH @env.context_class.class_eval do include ::Sprockets::Rails::Context end @env.context_class.digest_assets = true @logo_digest = @env["logo.png"].etag @logo_uri = @env["logo.png"].uri end def test_basic input = { environment: @env, data: 'background: url(logo.png);', filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) assert_equal("background: url(/logo-#{@logo_digest}.png);", output[:data]) end def test_spaces input = { environment: @env, data: 'background: url( logo.png );', filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) assert_equal("background: url(/logo-#{@logo_digest}.png);", output[:data]) end def test_single_quote input = { environment: @env, data: "background: url('logo.png');", filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) assert_equal("background: url(/logo-#{@logo_digest}.png);", output[:data]) end def test_double_quote input = { environment: @env, data: 'background: url("logo.png");', filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) assert_equal("background: url(/logo-#{@logo_digest}.png);", output[:data]) end def test_dependencies_are_tracked input = { environment: @env, data: 'background: url(logo.png);', filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) assert_equal(1, output[:links].size) assert_equal(@logo_uri, output[:links].first) end def test_relative input = { environment: @env, data: 'background: url(./logo.png);', filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) assert_equal("background: url(/logo-#{@logo_digest}.png);", output[:data]) end def test_subdirectory input = { environment: @env, data: "background: url('jquery/jquery.js');", filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) jquery_digest = 'c6910e1db4a5ed4905be728ab786471e81565f4a9d544734b199f3790de9f9a3' assert_equal("background: url(/jquery/jquery-#{jquery_digest}.js);", output[:data]) end def test_protocol_relative_paths input = { environment: @env, data: "background: url(//assets.example.com/assets/fontawesome-webfont-82ff0fe46a6f60e0ab3c4a9891a0ae0a1f7b7e84c625f55358379177a2dcb202.eot);", filename: 'url2.css', metadata: {} } output = Sprockets::Rails::AssetUrlProcessor.call(input) assert_equal("background: url(//assets.example.com/assets/fontawesome-webfont-82ff0fe46a6f60e0ab3c4a9891a0ae0a1f7b7e84c625f55358379177a2dcb202.eot);", output[:data]) end end sprockets-rails-3.5.2/test/test_helper.rb000066400000000000000000001260571465251666500205230ustar00rootroot00000000000000require 'minitest/autorun' require 'action_view' require 'sprockets' # Apps generated before Rails 7.0 without rails/all require sprockets/railtie, not sprockets/rails # Same with other reverse dependencies like sassc-rails require 'sprockets/railtie' require 'sprockets/rails/context' require 'sprockets/rails/helper' require 'rails/version' ActiveSupport::TestCase.test_order = :random if ActiveSupport::TestCase.respond_to?(:test_order=) def append_media_attribute if ::Rails::VERSION::MAJOR < 7 "media=\"screen\"" end end class HelperTest < ActionView::TestCase FIXTURES_PATH = File.expand_path("../fixtures", __FILE__) def setup @assets = Sprockets::Environment.new @assets.append_path FIXTURES_PATH @assets.context_class.class_eval do include ::Sprockets::Rails::Context end tmp = File.expand_path("../../tmp", __FILE__) @manifest = Sprockets::Manifest.new(@assets, tmp) @view = ActionView::Base.new(ActionView::LookupContext.new([]), {}, nil) @view.extend ::Sprockets::Rails::Helper @view.assets_environment = @assets @view.assets_manifest = @manifest @view.resolve_assets_with = [ :manifest, :environment ] @view.assets_prefix = "/assets" @view.assets_precompile = %w( manifest.js ) precompiled_assets = @manifest.find(@view.assets_precompile).map(&:logical_path) @view.check_precompiled_asset = true @view.unknown_asset_fallback = true @view.precompiled_asset_checker = -> logical_path { precompiled_assets.include? logical_path } @view.request = ActionDispatch::Request.new({ "rack.url_scheme" => "https" }) @assets.context_class.assets_prefix = @view.assets_prefix @assets.context_class.config = @view.config @foo_js_integrity = @assets['foo.js'].integrity @foo_css_integrity = @assets['foo.css'].integrity @bar_js_integrity = @assets['bar.js'].integrity @foo_js_digest = @assets['foo.js'].etag @foo_css_digest = @assets['foo.css'].etag @bar_js_digest = @assets['bar.js'].etag @bar_css_digest = @assets['bar.css'].etag @logo_digest = @assets['logo.png'].etag @foo_self_js_digest = @assets['foo.self.js'].etag @foo_self_css_digest = @assets['foo.self.css'].etag @bar_self_js_digest = @assets['bar.self.js'].etag @bar_self_css_digest = @assets['bar.self.css'].etag @foo_debug_js_digest = @assets['foo.debug.js'].etag @foo_debug_css_digest = @assets['foo.debug.css'].etag @bar_debug_js_digest = @assets['bar.debug.js'].etag @bar_debug_css_digest = @assets['bar.debug.css'].etag @dependency_js_digest = @assets['dependency.js'].etag @dependency_css_digest = @assets['dependency.css'].etag @file1_js_digest = @assets['file1.js'].etag @file1_css_digest = @assets['file1.css'].etag @file2_js_digest = @assets['file2.js'].etag @file2_css_digest = @assets['file2.css'].etag @dependency_self_js_digest = @assets['dependency.self.js'].etag @dependency_self_css_digest = @assets['dependency.self.css'].etag @file1_self_js_digest = @assets['file1.self.js'].etag @file1_self_css_digest = @assets['file1.self.css'].etag @file2_self_js_digest = @assets['file2.self.js'].etag @file2_self_css_digest = @assets['file2.self.css'].etag @dependency_debug_js_digest = @assets['dependency.debug.js'].etag @dependency_debug_css_digest = @assets['dependency.debug.css'].etag @file1_debug_js_digest = @assets['file1.debug.js'].etag @file1_debug_css_digest = @assets['file1.debug.css'].etag @file2_debug_js_digest = @assets['file2.debug.js'].etag @file2_debug_css_digest = @assets['file2.debug.css'].etag end def using_sprockets4? Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new('4.x') end def test_foo_and_bar_different_digests refute_equal @foo_js_digest, @bar_js_digest refute_equal @foo_css_digest, @bar_css_digest end def assert_servable_asset_url(url) path, query = url.split("?", 2) path = path.sub(@view.assets_prefix, "") status = @assets.call({ 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => path, 'QUERY_STRING' => query })[0] assert_equal 200, status, "#{url} responded with #{status}" end end class NoHostHelperTest < HelperTest def test_javascript_include_tag Sprockets::Rails.deprecator.silence do assert_dom_equal %(), @view.javascript_include_tag("static") assert_dom_equal %(), @view.javascript_include_tag("static.js") assert_dom_equal %(), @view.javascript_include_tag(:static) assert_dom_equal %(), @view.javascript_include_tag("/elsewhere.js") assert_dom_equal %(\n), @view.javascript_include_tag("/script1.js", "script2.js") assert_dom_equal %(), @view.javascript_include_tag("http://example.com/script") assert_dom_equal %(), @view.javascript_include_tag("http://example.com/script.js") assert_dom_equal %(), @view.javascript_include_tag("//example.com/script.js") assert_dom_equal %(), @view.javascript_include_tag("static", :defer => "defer") assert_dom_equal %(), @view.javascript_include_tag("static", :async => "async") end end def test_stylesheet_link_tag Sprockets::Rails.deprecator.silence do assert_dom_equal %(), @view.stylesheet_link_tag("static") assert_dom_equal %(), @view.stylesheet_link_tag("static.css") assert_dom_equal %(), @view.stylesheet_link_tag(:static) assert_dom_equal %(), @view.stylesheet_link_tag("/elsewhere.css") assert_dom_equal %(\n), @view.stylesheet_link_tag("/style1.css", "style2.css") assert_dom_equal %(), @view.stylesheet_link_tag("http://www.example.com/styles/style") assert_dom_equal %(), @view.stylesheet_link_tag("http://www.example.com/styles/style.css") assert_dom_equal %(), @view.stylesheet_link_tag("//www.example.com/styles/style.css") assert_dom_equal %(), @view.stylesheet_link_tag("print", :media => "print") assert_dom_equal %(), @view.stylesheet_link_tag("print", :media => "") end end def test_javascript_include_tag_integrity Sprockets::Rails.deprecator.silence do assert_dom_equal %(), @view.javascript_include_tag("static", integrity: "sha-256-TvVUHzSfftWg1rcfL6TIJ0XKEGrgLyEq6lEpcmrG9qs=") assert_dom_equal %(), @view.javascript_include_tag("static", integrity: true) assert_dom_equal %(), @view.javascript_include_tag("static", integrity: false) assert_dom_equal %(), @view.javascript_include_tag("static", integrity: nil) end end def test_stylesheet_link_tag_integrity Sprockets::Rails.deprecator.silence do assert_dom_equal %(), @view.stylesheet_link_tag("static", integrity: "sha-256-5YzTQPuOJz/EpeXfN/+v1sxsjAj/dw8q26abiHZM3A4=") assert_dom_equal %(), @view.stylesheet_link_tag("static", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag("static", integrity: false) end end def test_javascript_path Sprockets::Rails.deprecator.silence do assert_equal "/javascripts/xmlhr.js", @view.javascript_path("xmlhr") assert_equal "/javascripts/xmlhr.js", @view.javascript_path("xmlhr.js") assert_equal "/javascripts/super/xmlhr.js", @view.javascript_path("super/xmlhr") assert_equal "/super/xmlhr.js", @view.javascript_path("/super/xmlhr") assert_equal "/javascripts/xmlhr.js?foo=1", @view.javascript_path("xmlhr.js?foo=1") assert_equal "/javascripts/xmlhr.js?foo=1", @view.javascript_path("xmlhr?foo=1") assert_equal "/javascripts/xmlhr.js#hash", @view.javascript_path("xmlhr.js#hash") assert_equal "/javascripts/xmlhr.js#hash", @view.javascript_path("xmlhr#hash") assert_equal "/javascripts/xmlhr.js?foo=1#hash", @view.javascript_path("xmlhr.js?foo=1#hash") end end def test_stylesheet_path Sprockets::Rails.deprecator.silence do assert_equal "/stylesheets/bank.css", @view.stylesheet_path("bank") assert_equal "/stylesheets/bank.css", @view.stylesheet_path("bank.css") assert_equal "/stylesheets/subdir/subdir.css", @view.stylesheet_path("subdir/subdir") assert_equal "/subdir/subdir.css", @view.stylesheet_path("/subdir/subdir.css") assert_equal "/stylesheets/bank.css?foo=1", @view.stylesheet_path("bank.css?foo=1") assert_equal "/stylesheets/bank.css?foo=1", @view.stylesheet_path("bank?foo=1") assert_equal "/stylesheets/bank.css#hash", @view.stylesheet_path("bank.css#hash") assert_equal "/stylesheets/bank.css#hash", @view.stylesheet_path("bank#hash") assert_equal "/stylesheets/bank.css?foo=1#hash", @view.stylesheet_path("bank.css?foo=1#hash") end end end class NoSSLHelperTest < NoHostHelperTest def setup super @view.request = nil end def test_javascript_include_tag_integrity Sprockets::Rails.deprecator.silence do assert_dom_equal %(), @view.javascript_include_tag("static", integrity: true) assert_dom_equal %(), @view.javascript_include_tag("static", integrity: false) assert_dom_equal %(), @view.javascript_include_tag("static", integrity: nil) assert_dom_equal %(), @view.javascript_include_tag("static", integrity: "sha-256-TvVUHzSfftWg1rcfL6TIJ0XKEGrgLyEq6lEpcmrG9qs=") end assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: true) end def test_stylesheet_link_tag_integrity Sprockets::Rails.deprecator.silence do assert_dom_equal %(), @view.stylesheet_link_tag("static", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag("static", integrity: false) assert_dom_equal %(), @view.stylesheet_link_tag("static", integrity: nil) assert_dom_equal %(), @view.stylesheet_link_tag("static", integrity: "sha-256-5YzTQPuOJz/EpeXfN/+v1sxsjAj/dw8q26abiHZM3A4=") end assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: true) end end class LocalhostHelperTest < NoHostHelperTest def setup super @view.request = ActionDispatch::Request.new({ "rack.url_scheme" => "http", "REMOTE_ADDR" => "127.0.0.1" }) end def test_javascript_include_tag_integrity super assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: false) assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: nil) assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: true) assert_dom_equal %(), @view.javascript_include_tag("foo.js", integrity: true) assert_dom_equal %(), @view.javascript_include_tag(:foo, integrity: true) assert_dom_equal %(\n), @view.javascript_include_tag(:foo, :bar, integrity: true) end def test_stylesheet_link_tag_integrity super assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: false) assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: nil) assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag("foo.css", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag(:foo, integrity: true) assert_dom_equal %(\n), @view.stylesheet_link_tag(:foo, :bar, integrity: true) end end class RelativeHostHelperTest < HelperTest def setup super @view.config.asset_host = "assets.example.com" end def test_javascript_path Sprockets::Rails.deprecator.silence do assert_equal "https://assets.example.com/javascripts/xmlhr.js", @view.javascript_path("xmlhr") assert_equal "https://assets.example.com/javascripts/xmlhr.js", @view.javascript_path("xmlhr.js") assert_equal "https://assets.example.com/javascripts/super/xmlhr.js", @view.javascript_path("super/xmlhr") assert_equal "https://assets.example.com/super/xmlhr.js", @view.javascript_path("/super/xmlhr") assert_equal "https://assets.example.com/javascripts/xmlhr.js?foo=1", @view.javascript_path("xmlhr.js?foo=1") assert_equal "https://assets.example.com/javascripts/xmlhr.js?foo=1", @view.javascript_path("xmlhr?foo=1") assert_equal "https://assets.example.com/javascripts/xmlhr.js#hash", @view.javascript_path("xmlhr.js#hash") assert_equal "https://assets.example.com/javascripts/xmlhr.js#hash", @view.javascript_path("xmlhr#hash") assert_equal "https://assets.example.com/javascripts/xmlhr.js?foo=1#hash", @view.javascript_path("xmlhr.js?foo=1#hash") end assert_dom_equal %(), @view.javascript_include_tag("foo") assert_dom_equal %(), @view.javascript_include_tag("foo.js") assert_dom_equal %(), @view.javascript_include_tag(:foo) end def test_stylesheet_path Sprockets::Rails.deprecator.silence do assert_equal "https://assets.example.com/stylesheets/bank.css", @view.stylesheet_path("bank") assert_equal "https://assets.example.com/stylesheets/bank.css", @view.stylesheet_path("bank.css") assert_equal "https://assets.example.com/stylesheets/subdir/subdir.css", @view.stylesheet_path("subdir/subdir") assert_equal "https://assets.example.com/subdir/subdir.css", @view.stylesheet_path("/subdir/subdir.css") assert_equal "https://assets.example.com/stylesheets/bank.css?foo=1", @view.stylesheet_path("bank.css?foo=1") assert_equal "https://assets.example.com/stylesheets/bank.css?foo=1", @view.stylesheet_path("bank?foo=1") assert_equal "https://assets.example.com/stylesheets/bank.css#hash", @view.stylesheet_path("bank.css#hash") assert_equal "https://assets.example.com/stylesheets/bank.css#hash", @view.stylesheet_path("bank#hash") assert_equal "https://assets.example.com/stylesheets/bank.css?foo=1#hash", @view.stylesheet_path("bank.css?foo=1#hash") end assert_dom_equal %(), @view.stylesheet_link_tag("foo") assert_dom_equal %(), @view.stylesheet_link_tag("foo.css") assert_dom_equal %(), @view.stylesheet_link_tag(:foo) end def test_asset_url assert_equal "var url = '//assets.example.com/assets/foo.js';\n", @assets["url.js"].to_s assert_equal "p { background: url(//assets.example.com/assets/logo.png); }\n", @assets["url.css"].to_s end end class NoDigestHelperTest < NoHostHelperTest def setup super @view.digest_assets = false @assets.context_class.digest_assets = false end def test_javascript_include_tag super assert_dom_equal %(), @view.javascript_include_tag("foo") assert_dom_equal %(), @view.javascript_include_tag("foo.js") assert_dom_equal %(), @view.javascript_include_tag(:foo) assert_servable_asset_url "/assets/foo.js" end def test_stylesheet_link_tag super assert_dom_equal %(), @view.stylesheet_link_tag("foo") assert_dom_equal %(), @view.stylesheet_link_tag("foo.css") assert_dom_equal %(), @view.stylesheet_link_tag(:foo) assert_servable_asset_url "/assets/foo.css" end def test_javascript_path super assert_equal "/assets/foo.js", @view.javascript_path("foo") assert_servable_asset_url "/assets/foo.js" end def test_stylesheet_path super assert_equal "/assets/foo.css", @view.stylesheet_path("foo") assert_servable_asset_url "/assets/foo.css" end def test_asset_url assert_equal "var url = '/assets/foo.js';\n", @assets["url.js"].to_s assert_equal "p { background: url(/assets/logo.png); }\n", @assets["url.css"].to_s end end class DigestHelperTest < NoHostHelperTest def setup super @view.digest_assets = true @assets.context_class.digest_assets = true end def test_javascript_include_tag super assert_dom_equal %(), @view.javascript_include_tag("foo") assert_dom_equal %(), @view.javascript_include_tag("foo.js") assert_dom_equal %(), @view.javascript_include_tag(:foo) assert_dom_equal %(\n), @view.javascript_include_tag(:foo, :bar) assert_servable_asset_url "/assets/foo-#{@foo_js_digest}.js" end def test_stylesheet_link_tag super assert_dom_equal %(), @view.stylesheet_link_tag("foo") assert_dom_equal %(), @view.stylesheet_link_tag("foo.css") assert_dom_equal %(), @view.stylesheet_link_tag(:foo) assert_dom_equal %(\n), @view.stylesheet_link_tag(:foo, :bar) assert_servable_asset_url "/assets/foo-#{@foo_css_digest}.css" end def test_javascript_include_tag_integrity super assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: false) assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: nil) assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: true) assert_dom_equal %(), @view.javascript_include_tag("foo.js", integrity: true) assert_dom_equal %(), @view.javascript_include_tag(:foo, integrity: true) assert_dom_equal %(\n), @view.javascript_include_tag(:foo, :bar, integrity: true) end def test_stylesheet_link_tag_integrity super assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: false) assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: nil) assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag("foo.css", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag(:foo, integrity: true) assert_dom_equal %(\n), @view.stylesheet_link_tag(:foo, :bar, integrity: true) end def test_javascript_path super assert_equal "/assets/foo-#{@foo_js_digest}.js", @view.javascript_path("foo") assert_servable_asset_url "/assets/foo-#{@foo_js_digest}.js" end def test_stylesheet_path super assert_equal "/assets/foo-#{@foo_css_digest}.css", @view.stylesheet_path("foo") assert_servable_asset_url "/assets/foo-#{@foo_css_digest}.css" end def test_asset_digest_path assert_equal "foo-#{@foo_js_digest}.js", @view.asset_digest_path("foo.js") assert_equal "foo-#{@foo_css_digest}.css", @view.asset_digest_path("foo.css") end def test_asset_url assert_equal "var url = '/assets/foo-#{@foo_js_digest}.js';\n", @assets["url.js"].to_s assert_equal "p { background: url(/assets/logo-#{@logo_digest}.png); }\n", @assets["url.css"].to_s end end class DebugHelperTest < NoHostHelperTest def setup super @view.debug_assets = true end def test_javascript_include_tag super if using_sprockets4? assert_dom_equal %(), @view.javascript_include_tag(:foo) assert_dom_equal %(), @view.javascript_include_tag(:bar) assert_dom_equal %(\n), @view.javascript_include_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.debug.js" assert_servable_asset_url "/assets/bar.debug.js" assert_servable_asset_url "/assets/dependency.debug.js" assert_servable_asset_url "/assets/file1.debug.js" assert_servable_asset_url "/assets/file2.debug.js" else assert_dom_equal %(), @view.javascript_include_tag(:foo) assert_dom_equal %(\n), @view.javascript_include_tag(:bar) assert_dom_equal %(\n\n), @view.javascript_include_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.self.js?body=1" assert_servable_asset_url "/assets/bar.self.js?body=1" assert_servable_asset_url "/assets/dependency.self.js?body=1" assert_servable_asset_url "/assets/file1.self.js?body=1" assert_servable_asset_url "/assets/file2.self.js?body=1" end end def test_stylesheet_link_tag super if using_sprockets4? assert_dom_equal %(), @view.stylesheet_link_tag(:foo) assert_dom_equal %(), @view.stylesheet_link_tag(:bar) assert_dom_equal %(\n), @view.stylesheet_link_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.self.css" assert_servable_asset_url "/assets/bar.self.css" assert_servable_asset_url "/assets/dependency.self.css" assert_servable_asset_url "/assets/file1.self.css" assert_servable_asset_url "/assets/file2.self.css" else assert_dom_equal %(), @view.stylesheet_link_tag(:foo) assert_dom_equal %(\n), @view.stylesheet_link_tag(:bar) assert_dom_equal %(\n\n), @view.stylesheet_link_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.self.css?body=1" assert_servable_asset_url "/assets/bar.self.css?body=1" assert_servable_asset_url "/assets/dependency.self.css?body=1" assert_servable_asset_url "/assets/file1.self.css?body=1" assert_servable_asset_url "/assets/file2.self.css?body=1" end end def test_javascript_path super assert_equal "/assets/foo.js", @view.javascript_path("foo") assert_servable_asset_url "/assets/foo.js" end def test_stylesheet_path super assert_equal "/assets/foo.css", @view.stylesheet_path("foo") assert_servable_asset_url "/assets/foo.css" end end class DebugDigestHelperTest < NoHostHelperTest def setup super @view.debug_assets = true @view.digest_assets = true @assets.context_class.digest_assets = true end def test_javascript_include_tag super if using_sprockets4? assert_dom_equal %(), @view.javascript_include_tag(:foo) assert_dom_equal %(), @view.javascript_include_tag(:bar) assert_dom_equal %(\n), @view.javascript_include_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.debug-#{@foo_debug_js_digest}.js" assert_servable_asset_url "/assets/bar.debug-#{@bar_debug_js_digest}.js" assert_servable_asset_url "/assets/dependency.debug-#{@dependency_debug_js_digest}.js" assert_servable_asset_url "/assets/file1.debug-#{@file1_debug_js_digest}.js" assert_servable_asset_url "/assets/file2.debug-#{@file2_debug_js_digest}.js" else assert_dom_equal %(), @view.javascript_include_tag(:foo) assert_dom_equal %(\n), @view.javascript_include_tag(:bar) assert_dom_equal %(\n\n), @view.javascript_include_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.self-#{@foo_self_js_digest}.js?body=1" assert_servable_asset_url "/assets/bar.self-#{@bar_self_js_digest}.js?body=1" assert_servable_asset_url "/assets/dependency.self-#{@dependency_self_js_digest}.js?body=1" assert_servable_asset_url "/assets/file1.self-#{@file1_self_js_digest}.js?body=1" assert_servable_asset_url "/assets/file2.self-#{@file2_self_js_digest}.js?body=1" end end def test_stylesheet_link_tag super if using_sprockets4? assert_dom_equal %(), @view.stylesheet_link_tag(:foo) assert_dom_equal %(), @view.stylesheet_link_tag(:bar) assert_dom_equal %(\n), @view.stylesheet_link_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.self-#{@foo_self_css_digest}.css" assert_servable_asset_url "/assets/bar.self-#{@bar_self_css_digest}.css" assert_servable_asset_url "/assets/dependency.self-#{@dependency_self_css_digest}.css" assert_servable_asset_url "/assets/file1.self-#{@file1_self_css_digest}.css" assert_servable_asset_url "/assets/file2.self-#{@file2_self_css_digest}.css" else assert_dom_equal %(), @view.stylesheet_link_tag(:foo) assert_dom_equal %(\n), @view.stylesheet_link_tag(:bar) assert_dom_equal %(\n\n), @view.stylesheet_link_tag(:file1, :file2) assert_servable_asset_url "/assets/foo.self-#{@foo_self_css_digest}.css?body=1" assert_servable_asset_url "/assets/bar.self-#{@bar_self_css_digest}.css?body=1" assert_servable_asset_url "/assets/dependency.self-#{@dependency_self_css_digest}.css?body=1" assert_servable_asset_url "/assets/file1.self-#{@file1_self_css_digest}.css?body=1" assert_servable_asset_url "/assets/file2.self-#{@file2_self_css_digest}.css?body=1" end end def test_javascript_path super assert_equal "/assets/foo-#{@foo_js_digest}.js", @view.javascript_path("foo") assert_servable_asset_url "/assets/foo-#{@foo_js_digest}.js" end def test_stylesheet_path super assert_equal "/assets/foo-#{@foo_css_digest}.css", @view.stylesheet_path("foo") assert_servable_asset_url "/assets/foo-#{@foo_css_digest}.css" end def test_asset_digest_path assert_equal "foo-#{@foo_js_digest}.js", @view.asset_digest_path("foo.js") assert_equal "foo-#{@foo_css_digest}.css", @view.asset_digest_path("foo.css") end def test_asset_url assert_equal "var url = '/assets/foo-#{@foo_js_digest}.js';\n", @assets["url.js"].to_s assert_equal "p { background: url(/assets/logo-#{@logo_digest}.png); }\n", @assets["url.css"].to_s end end class ManifestHelperTest < NoHostHelperTest def setup super @manifest = Sprockets::Manifest.new(@assets, FIXTURES_PATH) @manifest.assets["foo.js"] = "foo-#{@foo_js_digest}.js" @manifest.assets["foo.css"] = "foo-#{@foo_css_digest}.css" @manifest.files["foo-#{@foo_js_digest}.js"] = { "integrity" => @foo_js_integrity } @manifest.files["foo-#{@foo_css_digest}.css"] = { "integrity" => @foo_css_integrity } @view.digest_assets = true @view.assets_environment = nil @view.assets_manifest = @manifest @view.resolve_assets_with = [ :manifest ] end def test_javascript_include_tag super assert_dom_equal %(), @view.javascript_include_tag("foo") assert_dom_equal %(), @view.javascript_include_tag("foo.js") assert_dom_equal %(), @view.javascript_include_tag(:foo) end def test_stylesheet_link_tag super assert_dom_equal %(), @view.stylesheet_link_tag("foo") assert_dom_equal %(), @view.stylesheet_link_tag("foo.css") assert_dom_equal %(), @view.stylesheet_link_tag(:foo) end def test_javascript_include_tag_integrity super assert_dom_equal %(), @view.javascript_include_tag("foo", integrity: true) assert_dom_equal %(), @view.javascript_include_tag("foo.js", integrity: true) assert_dom_equal %(), @view.javascript_include_tag(:foo, integrity: true) end def test_stylesheet_link_tag_integrity super assert_dom_equal %(), @view.stylesheet_link_tag("foo", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag("foo.css", integrity: true) assert_dom_equal %(), @view.stylesheet_link_tag(:foo, integrity: true) end def test_javascript_path super assert_equal "/assets/foo-#{@foo_js_digest}.js", @view.javascript_path("foo") end def test_stylesheet_path super assert_equal "/assets/foo-#{@foo_css_digest}.css", @view.stylesheet_path("foo") end def test_asset_digest_path assert_equal "foo-#{@foo_js_digest}.js", @view.asset_digest_path("foo.js") assert_equal "foo-#{@foo_css_digest}.css", @view.asset_digest_path("foo.css") end def test_assets_environment_unavailable refute @view.assets_environment end end class DebugManifestHelperTest < ManifestHelperTest def setup super @view.debug_assets = true end def test_javascript_include_tag_integrity pass end def test_stylesheet_link_tag_integrity pass end end class AssetResolverOrderingTest < HelperTest def setup super @view.digest_assets = true @view.assets_manifest = Sprockets::Manifest.new(@assets, FIXTURES_PATH).tap do |stale| stale.assets["foo.js"] = "foo-stale.js" stale.files["foo-stale.js"] = { "integrity" => "stale-manifest" } stale.assets["foo.css"] = "foo-stale.css" stale.files["foo-stale.css"] = { "integrity" => "stale-manifest" } end end def test_digest_prefers_asset_environment_over_manifest @view.resolve_assets_with = [ :environment, :manifest ] assert_equal "foo-#{@foo_js_digest}.js", @view.asset_digest_path("foo.js") assert_equal "foo-#{@foo_css_digest}.css", @view.asset_digest_path("foo.css") assert_equal @foo_js_integrity, @view.asset_integrity("foo.js") assert_equal @foo_css_integrity, @view.asset_integrity("foo.css") end def test_try_resolvers_until_first_result @view.resolve_assets_with = [ :manifest, :environment ] assert_equal 'foo-stale.js', @view.asset_digest_path('foo.js') assert_equal "bar-#{@bar_js_digest}.js", @view.asset_digest_path('bar.js') assert_nil @view.asset_digest_path('nonexistent') assert_equal 'stale-manifest', @view.asset_integrity('foo.js') assert_equal @bar_js_integrity, @view.asset_integrity('bar.js') assert_nil @view.asset_integrity('nonexistent') end def test_obeys_asset_resolver_order @view.resolve_assets_with = [] assert_nil @view.asset_digest_path('foo.js') assert_nil @view.asset_integrity('foo.js') end end class AssetUrlHelperLinksTarget < HelperTest def test_precompile_allows_links @view.assets_precompile = ["url.css"] precompiled_assets = @manifest.find(@view.assets_precompile).map(&:logical_path) @view.precompiled_asset_checker = -> logical_path { precompiled_assets.include? logical_path } assert @view.asset_path("url.css") assert @view.asset_path("logo.png") assert_raises(Sprockets::Rails::Helper::AssetNotPrecompiled) do @view.asset_path("foo.css") end end def test_links_image_target assert_match "logo.png", @assets['url.css'].links.to_a[0] end def test_doesnt_track_public_assets refute_match "does_not_exist.png", @assets['error/missing.css'].links.to_a[0] end def test_asset_environment_reference_is_cached env = @view.assets_environment assert_kind_of Sprockets::CachedEnvironment, env assert @view.assets_environment.equal?(env), "view didn't return the same cached instance" end end class PrecompiledAssetHelperTest < HelperTest def setup super @bundle_js_name = '/assets/bundle.js' end # both subclass and more specific error are supported due to # https://github.com/rails/sprockets-rails/pull/414/commits/760a805a9f56d3df0d4b83bd4a5a6476eb3aeb29 def test_javascript_precompile assert_raises(Sprockets::Rails::Helper::AssetNotPrecompiled) do @view.javascript_include_tag("not_precompiled") end end def test_javascript_precompile_throws_the_descriptive_error assert_raises(Sprockets::Rails::Helper::AssetNotPrecompiledError) do @view.javascript_include_tag("not_precompiled") end end def test_stylesheet_precompile assert_raises(Sprockets::Rails::Helper::AssetNotPrecompiled) do @view.stylesheet_link_tag("not_precompiled") end end def test_index_files assert_dom_equal %(), @view.javascript_include_tag("bundle") end end class DeprecationTest < HelperTest def test_deprecations_for_asset_path @view.send(:define_singleton_method, :public_compute_asset_path, -> {}) assert_deprecated("use the `skip_pipeline: true` option", Sprockets::Rails.deprecator) do @view.asset_path("does_not_exist.noextension") end ensure @view.instance_eval('undef :public_compute_asset_path') end def test_deprecations_for_asset_url @view.send(:define_singleton_method, :public_compute_asset_path, -> {}) assert_deprecated("use the `skip_pipeline: true` option", Sprockets::Rails.deprecator) do @view.asset_url("does_not_exist.noextension") end ensure @view.instance_eval('undef :public_compute_asset_path') end def test_deprecations_for_image_tag @view.send(:define_singleton_method, :public_compute_asset_path, -> {}) assert_deprecated("use the `skip_pipeline: true` option", Sprockets::Rails.deprecator) do @view.image_tag("does_not_exist.noextension") end ensure @view.instance_eval('undef :public_compute_asset_path') end end class RaiseUnlessPrecompiledAssetDisabledTest < HelperTest def test_check_precompiled_asset_enabled @view.check_precompiled_asset = true assert_raises(Sprockets::Rails::Helper::AssetNotPrecompiled) do @view.asset_path("not_precompiled.css") end end def test_check_precompiled_asset_disabled @view.check_precompiled_asset = false assert @view.asset_path("not_precompiled.css") end end class PrecompiledDebugAssetHelperTest < PrecompiledAssetHelperTest # Re-run all PrecompiledAssetHelperTest with a different setup def setup super @view.debug_assets = true if using_sprockets4? @bundle_js_name = '/assets/bundle.debug.js' else @bundle_js_name = '/assets/bundle/index.self.js?body=1' end end end sprockets-rails-3.5.2/test/test_quiet_assets.rb000066400000000000000000000033321465251666500217430ustar00rootroot00000000000000require 'active_support' require 'active_support/testing/isolation' require 'active_support/log_subscriber/test_helper' require 'minitest/autorun' require 'sprockets/railtie' require 'rails' Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) class TestQuietAssets < Minitest::Test include ActiveSupport::Testing::Isolation ROOT_PATH = Pathname.new(File.expand_path("../../tmp/app", __FILE__)) ASSET_PATH = ROOT_PATH.join("app","assets", "config") def setup FileUtils.mkdir_p(ROOT_PATH) Dir.chdir(ROOT_PATH) @app = Class.new(Rails::Application) @app.config.eager_load = false @app.config.logger = ActiveSupport::Logger.new("/dev/null") @app.config.active_support.to_time_preserves_timezone = :zone FileUtils.mkdir_p(ASSET_PATH) File.open(ASSET_PATH.join("manifest.js"), "w") { |f| f << "" } @app.initialize! Rails.logger.level = Logger::DEBUG end def test_silences_with_default_prefix assert_equal Logger::ERROR, middleware.call("PATH_INFO" => "/assets/stylesheets/application.css") end def test_silences_with_custom_prefix Rails.application.config.assets.prefix = "path/to" assert_equal Logger::ERROR, middleware.call("PATH_INFO" => "/path/to/thing") end def test_does_not_silence_without_match assert_equal Logger::DEBUG, middleware.call("PATH_INFO" => "/path/to/thing") end def test_logger_does_not_respond_to_silence ::Rails.logger.stub :respond_to?, false do assert_raises(Sprockets::Rails::LoggerSilenceError) { middleware.call("PATH_INFO" => "/assets/stylesheets/application.css") } end end private def middleware @middleware ||= Sprockets::Rails::QuietAssets.new(->(env) { Rails.logger.level }) end end sprockets-rails-3.5.2/test/test_railtie.rb000066400000000000000000000275601465251666500206740ustar00rootroot00000000000000require 'active_support' require 'active_support/testing/isolation' require 'minitest/autorun' Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) def silence_stderr orig_stderr = $stderr.clone $stderr.reopen File.new('/dev/null', 'w') yield ensure $stderr.reopen orig_stderr end class TestBoot < Minitest::Test include ActiveSupport::Testing::Isolation ROOT = File.expand_path("../../tmp/app", __FILE__) FIXTURES_PATH = File.expand_path("../fixtures", __FILE__) attr_reader :app def setup require 'rails' # Can't seem to get initialize to run w/o this require 'action_controller/railtie' require 'active_support/dependencies' require 'tzinfo' ENV['RAILS_ENV'] = 'test' FileUtils.mkdir_p ROOT Dir.chdir ROOT @app = Class.new(Rails::Application) @app.config.eager_load = false @app.config.time_zone = 'UTC' @app.config.middleware ||= Rails::Configuration::MiddlewareStackProxy.new @app.config.active_support.deprecation = :notify Dir.chdir(app.root) do dir = "app/assets/config" FileUtils.mkdir_p(dir) File.open("#{ dir }/manifest.js", "w") do |f| f << "" end end end def test_initialize app.initialize! end end class TestRailtie < TestBoot def setup require 'sprockets/railtie' super # sprockets-4.0.0.beta8 does not like 'rake assets:clobber' when this directory does not exist Dir.chdir(app.root) do dir = "tmp/cache/assets/sprockets" FileUtils.mkdir_p(dir) end end def test_defaults_to_compile_assets_with_env_and_manifest_available assert_equal true, app.config.assets.compile app.initialize! # Env is available refute_nil env = app.assets assert_kind_of Sprockets::Environment, env # Manifest is always available assert manifest = app.assets_manifest assert_equal app.assets, manifest.environment assert_equal File.join(ROOT, "public/assets"), manifest.dir # Resolves against manifest then environment by default assert_equal [ :manifest, :environment ], app.config.assets.resolve_with # Sprockets config assert_equal ROOT, env.root assert_equal "", env.version assert env.cache assert_includes(env.paths, "#{ROOT}/app/assets/config") assert_nil env.js_compressor assert_nil env.css_compressor end def test_disabling_compile_has_manifest_but_no_env app.configure do config.assets.compile = false end assert_equal false, app.config.assets.compile app.initialize! # No env when compile is disabled assert_nil app.assets # Manifest is always available refute_nil manifest = app.assets_manifest assert_nil manifest.environment assert_equal File.join(ROOT, "public/assets"), manifest.dir # Resolves against manifest only assert_equal [ :manifest ], app.config.assets.resolve_with end def test_enabling_debug_resolves_with_env_only app.configure do config.assets.debug = true end assert_equal true, app.config.assets.debug assert_equal true, app.config.assets.compile app.initialize! # Resolves against environment only assert_equal [ :environment ], app.config.assets.resolve_with end def test_copies_paths app.configure do config.assets.paths << "javascripts" config.assets.paths << "stylesheets" end app.initialize! assert env = app.assets assert_includes(env.paths, "#{ROOT}/javascripts") assert_includes(env.paths, "#{ROOT}/stylesheets") assert_includes(env.paths, "#{ROOT}/app/assets/config") end def test_compressors app.configure do config.assets.js_compressor = :uglifier config.assets.css_compressor = :sass end app.initialize! assert env = app.assets assert_equal Sprockets::UglifierCompressor.name, env.js_compressor.name silence_warnings do require 'sprockets/sass_compressor' end assert_equal Sprockets::SassCompressor.name, env.css_compressor.name end def test_custom_compressors compressor = Class.new do def self.call(input) { data: input[:data] } end end app.configure do config.assets.configure do |env| env.register_compressor "application/javascript", :test_js, compressor env.register_compressor "text/css", :test_css, compressor end config.assets.js_compressor = :test_js config.assets.css_compressor = :test_css end app.initialize! assert env = app.assets assert_equal compressor, env.js_compressor assert_equal compressor, env.css_compressor end def test_default_gzip_config app.initialize! assert env = app.assets assert_equal true, env.gzip? end def test_gzip_config app.configure do config.assets.gzip = false end app.initialize! assert env = app.assets assert_equal false, env.gzip? end def test_default_check_precompiled_assets assert app.config.assets.check_precompiled_asset app.initialize! @view = action_view assert @view.check_precompiled_asset end def test_configure_check_precompiled_assets app.configure do config.assets.check_precompiled_asset = false end app.initialize! @view = action_view refute @view.check_precompiled_asset end def test_version app.configure do config.assets.version = 'v2' end app.initialize! assert env = app.assets assert_equal "v2", env.version end def test_configure app.configure do config.assets.configure do |env| env.append_path "javascripts" end config.assets.configure do |env| env.append_path "stylesheets" end end app.initialize! assert env = app.assets assert_includes(env.paths, "#{ROOT}/javascripts") assert_includes(env.paths, "#{ROOT}/stylesheets") assert_includes(env.paths, "#{ROOT}/app/assets/config") end def test_environment_is_frozen_if_caching_classes app.configure do config.cache_classes = true end app.initialize! assert env = app.assets assert_kind_of Sprockets::CachedEnvironment, env end def test_action_view_helper app.configure do config.assets.paths << FIXTURES_PATH config.assets.precompile += ["foo.js"] end app.initialize! assert app.assets.paths.include?(FIXTURES_PATH) assert_equal false, ActionView::Base.debug_assets assert_equal true, ActionView::Base.digest_assets assert_equal "/assets", ActionView::Base.assets_prefix assert_equal app.assets, ActionView::Base.assets_environment assert_equal app.assets_manifest, ActionView::Base.assets_manifest assert_kind_of Sprockets::Environment, ActionView::Base.assets_environment @view = action_view assert_equal "/javascripts/xmlhr.js", @view.javascript_path("xmlhr") assert_equal "/assets/foo-4ef5541f349f7ed5a0d6b71f2fa4c82745ca106ae02f212aea5129726ac6f6ab.js", @view.javascript_path("foo") env = @view.assets_environment assert_kind_of Sprockets::CachedEnvironment, env assert @view.assets_environment.equal?(env), "view didn't return the same cached instance" end def test_action_view_helper_when_no_compile app.configure do config.assets.compile = false end assert_equal false, app.config.assets.compile app.initialize! refute ActionView::Base.assets_environment assert_equal app.assets_manifest, ActionView::Base.assets_manifest @view = action_view refute @view.assets_environment assert_equal app.assets_manifest, @view.assets_manifest end def test_sprockets_context_helper app.initialize! assert env = app.assets assert_equal "/assets", env.context_class.assets_prefix assert_equal true, env.context_class.digest_assets assert_nil env.context_class.config.asset_host end def test_manifest_path app.configure do config.assets.manifest = Rails.root.join('config','foo','bar.json') end app.initialize! assert manifest = app.assets_manifest assert_match %r{config/foo/bar\.json$}, manifest.path assert_match %r{public/assets$}, manifest.dir end def test_manifest_path_respects_rails_public_path app.configure do config.paths['public'] = 'test_public' end app.initialize! assert manifest = app.assets_manifest assert_match %r{test_public/assets/\.sprockets-manifest-.*\.json$}, manifest.path assert_match %r{test_public/assets$}, manifest.dir end def test_load_tasks app.initialize! app.load_tasks assert Rake.application['assets:environment'] assert Rake.application['assets:precompile'] assert Rake.application['assets:clean'] assert Rake.application['assets:clobber'] end def test_task_precompile app.configure do config.assets.paths << FIXTURES_PATH config.assets.precompile += ["foo.js", "url.css"] end app.initialize! app.load_tasks path = "#{app.assets_manifest.dir}/foo-#{Rails.application.assets['foo.js'].etag}.js" silence_stderr do Rake.application['assets:clobber'].execute end refute File.exist?(path) silence_stderr do Rake.application['assets:precompile'].execute end assert File.exist?(path) url_css_path = File.join(app.assets_manifest.dir, Rails.application.assets['url.css'].digest_path) assert_match(%r{/assets/logo-#{Rails.application.assets['logo.png'].etag}.png}, File.read(url_css_path)) silence_stderr do Rake.application['assets:clobber'].execute end refute File.exist?(path) end def test_task_precompile_compile_false app.configure do config.assets.compile = false config.assets.paths << FIXTURES_PATH config.assets.precompile += ["foo.js"] end app.initialize! app.load_tasks path = "#{app.assets_manifest.dir}/foo-4ef5541f349f7ed5a0d6b71f2fa4c82745ca106ae02f212aea5129726ac6f6ab.js" silence_stderr do Rake.application['assets:clobber'].execute end refute File.exist?(path) silence_stderr do Rake.application['assets:precompile'].execute end assert File.exist?(path) silence_stderr do Rake.application['assets:clobber'].execute end refute File.exist?(path) end def test_direct_build_environment_call app.configure do config.assets.paths << "javascripts" config.assets.paths << "stylesheets" end app.initialize! assert env = Sprockets::Railtie.build_environment(app) assert_kind_of Sprockets::Environment, env assert_equal ROOT, env.root assert_includes(env.paths, "#{ROOT}/javascripts") assert_includes(env.paths, "#{ROOT}/stylesheets") assert_includes(env.paths, "#{ROOT}/app/assets/config") end def test_quiet_assets_defaults_to_off app.initialize! app.load_tasks assert_equal false, app.config.assets.quiet refute app.config.middleware.include?(Sprockets::Rails::QuietAssets) end def test_quiet_assets_inserts_middleware app.configure do config.assets.quiet = true end app.initialize! app.load_tasks middleware = app.config.middleware assert_equal true, app.config.assets.quiet assert middleware.include?(Sprockets::Rails::QuietAssets) assert middleware.each_cons(2).include?([Sprockets::Rails::QuietAssets, Rails::Rack::Logger]) end def test_resolve_assets_in_css_urls_defaults_to_true app.initialize! assert_equal true, app.config.assets.resolve_assets_in_css_urls assert_includes Sprockets.postprocessors['text/css'], Sprockets::Rails::AssetUrlProcessor end def test_resolve_assets_in_css_urls_when_false_avoids_registering_postprocessor app.configure do config.assets.resolve_assets_in_css_urls = false end app.initialize! assert_equal false, app.config.assets.resolve_assets_in_css_urls refute_includes Sprockets.postprocessors['text/css'], Sprockets::Rails::AssetUrlProcessor end private def action_view ActionView::Base.new(ActionView::LookupContext.new([]), {}, nil) end end sprockets-rails-3.5.2/test/test_sourcemapping_url_processor.rb000066400000000000000000000032201465251666500250630ustar00rootroot00000000000000require 'minitest/autorun' require 'sprockets/railtie' Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) class TestSourceMappingUrlProcessor < Minitest::Test def setup @env = Sprockets::Environment.new end def test_successful @env.context_class.class_eval do def resolve(path, **kargs) "/assets/mapped.js.map" end def asset_path(path, options = {}) "/assets/mapped-HEXGOESHERE.js.map" end end input = { environment: @env, data: "var mapped;\n//# sourceMappingURL=mapped.js.map", name: 'mapped', filename: 'mapped.js', metadata: {} } output = Sprockets::Rails::SourcemappingUrlProcessor.call(input) assert_equal({ data: "var mapped;\n//# sourceMappingURL=/assets/mapped-HEXGOESHERE.js.map\n//!\n" }, output) end def test_resolving_erroneously_without_map_extension @env.context_class.class_eval do def resolve(path, **kargs) "/assets/mapped.js" end end input = { environment: @env, data: "var mapped;\n//# sourceMappingURL=mapped.js.map", name: 'mapped', filename: 'mapped.js', metadata: {} } output = Sprockets::Rails::SourcemappingUrlProcessor.call(input) assert_equal({ data: "var mapped;\n" }, output) end def test_missing @env.context_class.class_eval do def resolve(path, **kargs) raise Sprockets::FileNotFound end end input = { environment: @env, data: "var mapped;\n//# sourceMappingURL=mappedNOT.js.map", name: 'mapped', filename: 'mapped.js', metadata: {} } output = Sprockets::Rails::SourcemappingUrlProcessor.call(input) assert_equal({ data: "var mapped;\n" }, output) end end sprockets-rails-3.5.2/test/test_task.rb000066400000000000000000000072651465251666500202050ustar00rootroot00000000000000require 'minitest/autorun' require 'tmpdir' require 'sprockets' require 'sprockets/rails/task' Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) class TestTask < Minitest::Test FIXTURES_PATH = File.expand_path("../fixtures", __FILE__) def setup @rake = Rake::Application.new Rake.application = @rake @assets = Sprockets::Environment.new @assets.append_path FIXTURES_PATH @dir = File.join(Dir::tmpdir, 'rails', 'task') @manifest_file = File.join(Dir::tmpdir, 'rails', 'manifest', 'custom-manifest.json') FileUtils.mkdir_p File.dirname(@manifest_file) @manifest = Sprockets::Manifest.new(@assets, @dir, @manifest_file) Sprockets::Rails::Task.new do |t| t.environment = @assets t.manifest = @manifest t.assets = ['foo.js', 'foo-modified.js'] t.log_level = :fatal end @environment_ran = false # Stub Rails environment task @rake.define_task Rake::Task, :environment do @environment_ran = true end end def teardown Rake.application = nil FileUtils.rm_rf(@dir) assert Dir["#{@dir}/*"].empty? manifest_dir = File.dirname(@manifest_file) FileUtils.rm_rf(manifest_dir) assert Dir["#{manifest_dir}/*"].empty? end def test_precompile assert !@environment_ran digest_path = @assets['foo.js'].digest_path assert !File.exist?("#{@dir}/#{digest_path}") @rake['assets:precompile'].invoke assert @environment_ran assert File.exist?(@manifest_file) assert File.exist?("#{@dir}/#{digest_path}") end def test_precompile_without_manifest Sprockets::Rails::Task.new do |t| t.environment = @assets t.manifest = Sprockets::Manifest.new(@assets, @dir, nil) t.assets = ['foo.js', 'foo-modified.js'] t.log_level = :fatal end assert !@environment_ran digest_path = @assets['foo.js'].digest_path assert !File.exist?("#{@dir}/#{digest_path}") @rake['assets:precompile'].invoke assert @environment_ran assert Dir["#{@dir}/.sprockets-manifest-*.json"].first assert File.exist?("#{@dir}/#{digest_path}") end def test_clobber assert !@environment_ran digest_path = @assets['foo.js'].digest_path @rake['assets:precompile'].invoke assert File.exist?("#{@dir}/#{digest_path}") assert @environment_ran @rake['assets:clobber'].invoke assert !File.exist?("#{@dir}/#{digest_path}") end def test_clean assert !@environment_ran digest_path = @assets['foo.js'].digest_path @rake['assets:precompile'].invoke assert File.exist?("#{@dir}/#{digest_path}") assert @environment_ran @rake['assets:clean'].invoke assert File.exist?("#{@dir}/#{digest_path}") end def test_clean_with_keep_specified assert !@environment_ran path = Pathname.new(@assets['foo.js'].filename) new_path = path.join("../foo-modified.js") FileUtils.cp(path, new_path) assert File.exist?(new_path) digest_path = @assets['foo-modified.js'].digest_path @rake['assets:precompile'].invoke assert File.exist?("#{@dir}/#{digest_path}") assert @environment_ran # clean environment setup # modify file File.open(new_path, "a") {|f| f.write("var Bar;") } @rake['assets:precompile'].invoke old_digest_path = digest_path digest_path = @assets['foo-modified.js'].digest_path refute_equal old_digest_path, digest_path assert File.exist?("#{@dir}/#{old_digest_path}") assert File.exist?("#{@dir}/#{digest_path}") @rake['assets:clean'].invoke(0) assert File.exist?("#{@dir}/#{digest_path}") # refute File.exist?("#{@dir}/#{old_digest_path}") ensure FileUtils.rm(new_path) if new_path end end