diff --git a/Info.plist b/Info.plist new file mode 100644 index 00000000..00043b43 --- /dev/null +++ b/Info.plist @@ -0,0 +1,53 @@ + + + + + NSUIElement + 1 + CFBundleName + compass.app + CFBundleVersion + 0.0.1 + CFBundleAllowMixedLocalizations + true + CFBundleExecutable + JavaApplicationStub + CFBundleDevelopmentRegion + English + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleInfoDictionaryVersion + 6.0 + CFBundleIconFile + icon-osx.icns + Java + + MainClass + org.rubyforge.rawr.Main + JVMVersion + 1.6* + ClassPath + + $JAVAROOT/compass-app.jar + + Properties + + apple.laf.useScreenMenuBar + true + + JVMArchs + + i386 + + StartOnMainThread + true + VMOptions + + -Xverify:none + -Xbootclasspath/p:$APP_PACKAGE/Contents/Resources/Java/lib/java/jruby-complete.jar + + + + diff --git a/Info.plist.new b/Info.plist.new new file mode 100644 index 00000000..fcc988d7 --- /dev/null +++ b/Info.plist.new @@ -0,0 +1,53 @@ + + + + + NSUIElement + 1 + CFBundleName + compass.app + CFBundleVersion + 1.0 + CFBundleAllowMixedLocalizations + true + CFBundleExecutable + JavaApplicationStub + CFBundleDevelopmentRegion + English + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleInfoDictionaryVersion + 6.0 + CFBundleIconFile + icon-osx.icns + Java + + MainClass + org.rubyforge.rawr.Main + JVMVersion + 1.6* + ClassPath + + $JAVAROOT/compass-app.jar + + Properties + + apple.laf.useScreenMenuBar + true + + JVMArchs + + i386 + + StartOnMainThread + true + VMOptions + + -Xverify:none + -Xbootclasspath/p:$APP_PACKAGE/Contents/Resources/Java/lib/java/jruby-complete.jar + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README b/README index e69de29b..8d8f913a 100644 --- a/README +++ b/README @@ -0,0 +1,8 @@ +Homepage +====== +http://compass.handlino.com + +System Requirement +====== +* jruby http://jruby.org/ +* rawr http://rawr.rubyforge.org/ diff --git a/Rakefile b/Rakefile new file mode 100644 index 00000000..0a6a47bc --- /dev/null +++ b/Rakefile @@ -0,0 +1,122 @@ +require 'rawr' +require 'app_bundler' +require 'exe_bundler' +require 'yaml' +module Rawr + class AppBundler + # monkey patch again, option mac_do_not_generate_plist not work + def generate_info_plist + return + end + end +end + +namespace :rawr do + namespace :link_swt do + task :clean do + @swt_file = File.join( File.dirname(__FILE__), 'lib', 'java', 'swt.jar') + File.delete( File.join( File.dirname(__FILE__), 'lib', 'java', 'swt.jar')) if File.exists?( @swt_file ) + end + + task :win => ['rawr:link_swt:clean'] do + @current_os = "win" + copy( File.join( File.dirname(__FILE__), 'lib','swt','swt_win32.jar'), @swt_file ) + end + + task :linux => ['rawr:link_swt:clean'] do + @current_os = "linux" + copy( File.join( File.dirname(__FILE__), 'lib','swt','swt_linux32.jar'), @swt_file ) + end + + task :osx => ['rawr:link_swt:clean'] do + @current_os = "osx" + copy( File.join( File.dirname(__FILE__), 'lib','swt','swt_osx32.jar'), @swt_file ) + end + end + + namespace :bundle do + task :create_packages_dir do + @packages_dir = File.join(File.dirname(__FILE__), 'packages') + Dir.mkdir( @packages_dir ) unless File.exists?( @packages_dir ) + end + + task :write_version_info do + @revision ||= (%x{git log | head -c 17 | tail -c 10}).strip + @compile_time ||= Time.now.strftime('%Y%m%d%H%M') + @update_url = open('update_url').readline.strip if File.exists?("update_url") + File.open "src/compile_version.rb", 'w' do |file| + file << <<-INFO_ENDL + module CompileVersion + REVISION = '#{@revision}' + COMPILE_TIME = '#{@compile_time}' + UPDATE_URL = '#{@update_url}' + end +INFO_ENDL + end + end + + task(:app).clear_prerequisites.clear_actions + desc "Bundles the jar from rawr:jar into a native Mac OS X application (.app)" + task :app => ["rawr:bundle:create_packages_dir", "rawr:link_swt:osx", "rawr:bundle:write_version_info", "rawr:jar", CONFIG.osx_output_dir ] do + Rawr::AppBundler.new.deploy CONFIG + Dir.chdir File.dirname(__FILE__) + %x{cp -R lib/ruby #{CONFIG.osx_output_dir}/#{CONFIG.project_name}.app/Contents/Resources/ruby} + %x{cp -R lib/applescript #{CONFIG.osx_output_dir}/#{CONFIG.project_name}.app/Contents/Resources/applescript} + Dir.chdir CONFIG.osx_output_dir + %x{mv #{CONFIG.project_name}.app compass.app;} + @osx_bundle_file="compass.app.osx.#{@compile_time}-#{@revision}.zip" + %x{zip -9 -r #{@packages_dir}/#{@osx_bundle_file} compass.app} + end + + task(:exe).clear_prerequisites.clear_actions + desc "Bundles the jar from rawr:jar into a native Windows application (.exe)" + task :exe => ["rawr:bundle:create_packages_dir", "rawr:link_swt:win", "rawr:bundle:write_version_info", "rawr:jar", CONFIG.windows_output_dir ] do + Dir.chdir File.dirname(__FILE__) + %x{mkdir -p package/windows/package/windows} # yo~ show me the monkey, path for launch4j link fle + Rawr::ExeBundler.new.deploy CONFIG + %x{cp -R lib/ruby #{CONFIG.windows_output_dir}/lib} + %x{mv package/windows/package/windows/*.exe package/windows} + %x{rm -rf package/windows/package} + Dir.chdir 'package' + %x{rm -rf compass.app windows/*.xml; mv windows compass.app} + @windows_bundle_file="compass.app.windows.#{@compile_time}-#{@revision}.zip" + %x{zip -9 -r #{@packages_dir}/#{@windows_bundle_file} compass.app} + end + + desc "Bundles the jar from rawr:jar into a Linux script" + task :linux => ["rawr:bundle:create_packages_dir", "rawr:link_swt:linux", "rawr:bundle:write_version_info", "rawr:jar" ] do + Dir.chdir File.dirname(__FILE__) + %x{cp -R lib/ruby package/jar/lib} + %x{mv package/jar package/compass.app} + %x{echo "#!/bin/sh\njava -d32 -client -jar compass-app.jar" > package/compass.app/run.sh} + %x{chmod +x package/compass.app/run.sh} + Dir.chdir 'package' + @linux_bundle_file="compass.app.linux.#{@compile_time}-#{@revision}.zip" + %x{zip -9 -r #{@packages_dir}/#{@linux_bundle_file} compass.app} + end + + desc "Bundles Linux, OSX and Window package" + task :all do + Dir.chdir File.dirname(__FILE__) + %x{rm -rf package/* packages/*} + Rake::Task['rawr:bundle:app'].invoke + + Rake::Task.tasks.each{|t| t.reenable} + Dir.chdir File.dirname(__FILE__) + %x{rm -rf package/*} + Rake::Task['rawr:bundle:exe'].invoke + + Rake::Task.tasks.each{|t| t.reenable} + Dir.chdir File.dirname(__FILE__) + %x{rm -rf package/*} + Rake::Task['rawr:bundle:linux'].invoke + url_base=File.dirname(@update_url) + info={ "linux" => { "compile_version"=> @compile_time, "url"=> File.join(url_base, @linux_bundle_file) }, + "osx" => { "compile_version"=> @compile_time, "url"=> File.join(url_base, @osx_bundle_file) }, + "windows" => { "compile_version"=> @compile_time, "url"=> File.join(url_base, @windows_bundle_file)} } + open( File.join(@packages_dir,'update.yml'),'w' ) do |f| + f.write info.to_yaml + end + end + end +end diff --git a/bin/build-all.sh b/bin/build-all.sh new file mode 100755 index 00000000..cde11b93 --- /dev/null +++ b/bin/build-all.sh @@ -0,0 +1,2 @@ +#!/bin/sh +rake rawr:bundle:all diff --git a/bin/startJar-linux.sh b/bin/startJar-linux.sh new file mode 100755 index 00000000..f0b35973 --- /dev/null +++ b/bin/startJar-linux.sh @@ -0,0 +1,8 @@ +#!/bin/sh +if [ "$1" = "full" ]; then + rm `pwd`/lib/java/swt* + cp `pwd`/lib/swt/swt_linux32.jar `pwd`/lib/java/swt.jar + rake rawr:clean +fi +rake rawr:jar +java -d32 -client -Xverify:none -Xbootclasspath/a:lib/java/jruby-complete.jar -jar package/jar/compass-app.jar diff --git a/bin/startJar-osx.sh b/bin/startJar-osx.sh new file mode 100755 index 00000000..610a9a8c --- /dev/null +++ b/bin/startJar-osx.sh @@ -0,0 +1,8 @@ +#!/bin/sh +if [ "$1" = "full" ]; then + rm `pwd`/lib/java/swt* + cp `pwd`/lib/swt/swt_osx32.jar `pwd`/lib/java/swt.jar + rake rawr:clean +fi +rake rawr:jar +java -d32 -client -Xverify:none -XstartOnFirstThread -Xbootclasspath/a:lib/java/jruby-complete.jar -jar package/jar/compass-app.jar diff --git a/build_configuration.rb b/build_configuration.rb new file mode 100644 index 00000000..11617369 --- /dev/null +++ b/build_configuration.rb @@ -0,0 +1,89 @@ +configuration do |c| + # The name for your resulting application file (e.g., if the project_name is 'foo' then you'll get foo.jar, foo.exe, etc.) + # default value: "tka" + # + c.project_name = "compass-app" + + # Undocumented option 'output_dir' + # default value: "package" + # + #c.output_dir = "package" + + # The main ruby file to invoke, minus the .rb extension + # default value: "main" + # + #c.main_ruby_file = "main" + + # The fully-qualified name of the main Java file used to initiate the application. + # default value: "org.rubyforge.rawr.Main" + # + #c.main_java_file = "org.rubyforge.rawr.Main" + + # A list of directories where source files reside + # default value: ["src"] + # + #c.source_dirs = ["src",'lib/ruby/gem/gems/haml-3.0.24'] + + # A list of regexps of files to exclude + # default value: [] + # + #c.source_exclude_filter = [/spec/,/test/,/example/] + + # Whether Ruby source files should be compiled into .class files + # default value: true + # + #c.compile_ruby_files = true + + # A list of individual Java library files to include. + # default value: [] + # + #c.java_lib_files = [] + + # A list of directories for rawr to include . All files in the given directories get bundled up. + # default value: ["lib/java"] + # + #c.java_lib_dirs = ["lib/java"] + + # Undocumented option 'files_to_copy' + # default value: [] + # + #c.files_to_copy = ['lib/ruby', 'lib/applescript'] + + # Undocumented option 'target_jvm_version' + # default value: 1.6 + # + #c.target_jvm_version = 1.6 + + # Undocumented option 'jvm_arguments' + # default value: "" + # + #c.jvm_arguments = "" + + # Undocumented option 'java_library_path' + # default value: "" + # + #c.java_library_path = "" + + # Undocumented option 'extra_user_jars' + # default value: {} + # + #c.extra_user_jars[:data] = { :directory => 'data/images/png', + # :location_in_jar => 'images', + # :exclude => /*.bak$/ } + + # Undocumented option 'mac_do_not_generate_plist' + # default value: nil + # + #c.mac_do_not_generate_plist = true + + # Undocumented option 'mac_icon_path' + # default value: nil + # + c.mac_icon_path = Dir.pwd + "/src/data/images/icon/icon-osx.icns" + + # Undocumented option 'windows_icon_path' + # default value: nil + # + c.windows_icon_path = Dir.pwd + "/src/data/images/icon/icon-win.ico" + +end diff --git a/lib/applescript/64.png b/lib/applescript/64.png new file mode 100644 index 00000000..d6d36e1e Binary files /dev/null and b/lib/applescript/64.png differ diff --git a/lib/applescript/growl.applescript b/lib/applescript/growl.applescript new file mode 100644 index 00000000..c3c3bce1 Binary files /dev/null and b/lib/applescript/growl.applescript differ diff --git a/lib/java/jruby-complete.jar b/lib/java/jruby-complete.jar new file mode 100644 index 00000000..6d51cf01 Binary files /dev/null and b/lib/java/jruby-complete.jar differ diff --git a/lib/ruby/gem/bin/compass b/lib/ruby/gem/bin/compass new file mode 100644 index 00000000..45a689c9 --- /dev/null +++ b/lib/ruby/gem/bin/compass @@ -0,0 +1,19 @@ +#!/usr/bin/env jruby +# +# This file was generated by RubyGems. +# +# The application 'compass' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0" + +if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then + version = $1 + ARGV.shift +end + +gem 'compass', version +load Gem.bin_path('compass', 'compass', version) diff --git a/lib/ruby/gem/bin/css2sass b/lib/ruby/gem/bin/css2sass new file mode 100644 index 00000000..7c399036 --- /dev/null +++ b/lib/ruby/gem/bin/css2sass @@ -0,0 +1,19 @@ +#!/usr/bin/env jruby +# +# This file was generated by RubyGems. +# +# The application 'haml' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0" + +if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then + version = $1 + ARGV.shift +end + +gem 'haml', version +load Gem.bin_path('haml', 'css2sass', version) diff --git a/lib/ruby/gem/bin/haml b/lib/ruby/gem/bin/haml new file mode 100644 index 00000000..ecfc89de --- /dev/null +++ b/lib/ruby/gem/bin/haml @@ -0,0 +1,19 @@ +#!/usr/bin/env jruby +# +# This file was generated by RubyGems. +# +# The application 'haml' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0" + +if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then + version = $1 + ARGV.shift +end + +gem 'haml', version +load Gem.bin_path('haml', 'haml', version) diff --git a/lib/ruby/gem/bin/html2haml b/lib/ruby/gem/bin/html2haml new file mode 100644 index 00000000..7962398c --- /dev/null +++ b/lib/ruby/gem/bin/html2haml @@ -0,0 +1,19 @@ +#!/usr/bin/env jruby +# +# This file was generated by RubyGems. +# +# The application 'haml' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0" + +if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then + version = $1 + ARGV.shift +end + +gem 'haml', version +load Gem.bin_path('haml', 'html2haml', version) diff --git a/lib/ruby/gem/bin/sass b/lib/ruby/gem/bin/sass new file mode 100644 index 00000000..0592c7b3 --- /dev/null +++ b/lib/ruby/gem/bin/sass @@ -0,0 +1,19 @@ +#!/usr/bin/env jruby +# +# This file was generated by RubyGems. +# +# The application 'haml' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0" + +if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then + version = $1 + ARGV.shift +end + +gem 'haml', version +load Gem.bin_path('haml', 'sass', version) diff --git a/lib/ruby/gem/bin/sass-convert b/lib/ruby/gem/bin/sass-convert new file mode 100644 index 00000000..39071ccf --- /dev/null +++ b/lib/ruby/gem/bin/sass-convert @@ -0,0 +1,19 @@ +#!/usr/bin/env jruby +# +# This file was generated by RubyGems. +# +# The application 'haml' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0" + +if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then + version = $1 + ARGV.shift +end + +gem 'haml', version +load Gem.bin_path('haml', 'sass-convert', version) diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/.gitignore b/lib/ruby/gem/gems/chunky_png-0.11.1/.gitignore new file mode 100644 index 00000000..90e787eb --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +spec/resources/_*.png +/pkg +/tmp +/doc +/.yardoc +/.bundle +*.rbc diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/.infinity_test b/lib/ruby/gem/gems/chunky_png-0.11.1/.infinity_test new file mode 100644 index 00000000..8cac7800 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/.infinity_test @@ -0,0 +1,3 @@ +infinity_test do + use :rubies => %w(1.8.7 1.9.2 ree jruby rbx), :test_framework => :rspec +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/BENCHMARKS.rdoc b/lib/ruby/gem/gems/chunky_png-0.11.1/BENCHMARKS.rdoc new file mode 100644 index 00000000..e5b19e13 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/BENCHMARKS.rdoc @@ -0,0 +1,31 @@ += ChunkyPNG benchmark suite + +This small benchmark suite is intended to test the speed of PNG decoding +and encoding against different ruby interpreters. You can set the number +of runs by passing the N environment variable. You can execute them as +rake task or as standalone script. + + rake benchmark:encoding + rake benchmark:decoding + + rake benchmark N=10 # Run all of them, using n=10 + +Use rvm to simply run the tests against different interpreters. Of course, +make sure that the chunky_png is installed for all your interpreters. + + rvm 1.8.7,1.9.1,rbx rake benchmark N=10 + +== Results + +Some of my benchmark (N=50) result on my 2007 iMac can be found in this gist: +http://gist.github.com/495323 + +== Why is this relevant? + +ChunkyPNG is a pure Ruby library to handle PNG files. Decoding a PNG requires +a lot of integer math and bitwise operations, and moderate use of the unpack +method to read binary data. Encoding is a good test for Array#pack, and +depending on the encoding options, also requires a lot of calculations. +Therefore, the library is a good benchmark candidate for these methods and +algorithms. It has been used to improve the Array#pack and String#unpack +methods in Rubinius. diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/Gemfile b/lib/ruby/gem/gems/chunky_png-0.11.1/Gemfile new file mode 100644 index 00000000..e45e65f8 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/Gemfile @@ -0,0 +1,2 @@ +source :rubygems +gemspec diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/Gemfile.lock b/lib/ruby/gem/gems/chunky_png-0.11.1/Gemfile.lock new file mode 100644 index 00000000..48fad93e --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/Gemfile.lock @@ -0,0 +1,27 @@ +PATH + remote: . + specs: + chunky_png (0.11.1) + +GEM + remote: http://rubygems.org/ + specs: + diff-lcs (1.1.2) + rake (0.8.7) + rspec (2.1.0) + rspec-core (~> 2.1.0) + rspec-expectations (~> 2.1.0) + rspec-mocks (~> 2.1.0) + rspec-core (2.1.0) + rspec-expectations (2.1.0) + diff-lcs (~> 1.1.2) + rspec-mocks (2.1.0) + +PLATFORMS + java + ruby + +DEPENDENCIES + chunky_png! + rake + rspec (~> 2.1) diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/LICENSE b/lib/ruby/gem/gems/chunky_png-0.11.1/LICENSE new file mode 100644 index 00000000..028783f9 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2010 Willem van Bergen + +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. \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/README.rdoc b/lib/ruby/gem/gems/chunky_png-0.11.1/README.rdoc new file mode 100644 index 00000000..b8be5e63 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/README.rdoc @@ -0,0 +1,67 @@ += Chunky PNG + +This library can read and write PNG files. It is written in pure Ruby for +maximum portability. Let me rephrase: it does NOT require RMagick or any other +memory leaking image library. + +Source code:: http://github.com/wvanbergen/chunky_png/tree +RDoc:: http://rdoc.info/github/wvanbergen/chunky_png/master/file/README.rdoc +Wiki:: http://github.com/wvanbergen/chunky_png/wiki +Issue tracker:: http://github.com/wvanbergen/chunky_png/issues + +== Features + +* Decodes any image that the PNG standard allows. This includes all standard + color modes, all bit depths and all transparency, interlacing and filtering options. +* Encodes images supports all color modes (true color, grayscale and indexed) + and transparency for all these color modes. The best color mode will be + chosen automatically, based on the amount of used colors. +* R/W access to the image's pixels. +* R/W access to all image metadata that is stored in chunks. +* Memory efficient (uses a Fixnum, i.e. 4 or 8 bytes of memory per pixel, depending + on the hardware) +* Reasonably fast for Ruby standards, by only using integer math and a highly + optimized saving routine. +* Interoperability with RMagick if you really have to. + +Also, have a look at OilyPNG at http://github.com/wvanbergen/oily_png. OilyPNG is a +mixin module that implements some of the ChunkyPNG algorithms in C, which +provides a massive speed boost to encoding and decoding. + +== Usage + + require 'chunky_png' + + # Creating an image from scratch, save as an interlaced PNG + png = ChunkyPNG::Image.new(16, 16, ChunkyPNG::Color::TRANSPARENT) + png[1,1] = ChunkyPNG::Color.rgba(10, 20, 30, 128) + png[2,1] = ChunkyPNG::Color.rgba(0, 0, 0, 128) + png.save('filename.png', :interlace => true) + + # Compose images using alpha blending. + avatar = ChunkyPNG::Image.from_file('avatar.png') + badge = ChunkyPNG::Image.from_file('no_ie_badge.png') + avatar.compose(badge, 10, 10) + avatar.save('composited.png', :fast_rgba) # Force the fast saving routine. + + # Accessing metadata + image = ChunkyPNG::Image.from_file('with_metadata.png') + puts image.metadata['Title'] + image.metadata['Author'] = 'Willem van Bergen' + image.save('with_metadata.png') # Overwrite file + + # Low level access to PNG chunks + png_stream = ChunkyPNG::Datastream.from_file('filename.png') + png_stream.each_chunk { |chunk| p chunk.type } + +For more information, see the project wiki on http://github.com/wvanbergen/chunky_png/wiki +or the RDOC documentation on http://rdoc.info/github/wvanbergen/chunky_png/master/file/README.rdoc. + +== About + +The library is written by Willem van Bergen for Floorplanner.com, and released +under the MIT license (see LICENSE). Please contact me for questions or +remarks. Patches are greatly appreciated! + +P.S.: The name of this library is intentionally similar to Chunky Bacon and +Chunky GIF. Use Google if you want to know _why. :-) diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/Rakefile b/lib/ruby/gem/gems/chunky_png-0.11.1/Rakefile new file mode 100644 index 00000000..d39faa51 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/Rakefile @@ -0,0 +1,9 @@ +require 'rubygems' +require 'bundler' + +Bundler.setup + +Dir['tasks/*.rake'].each { |file| load(file) } + +GithubGem::RakeTasks.new(:gem) +task :default => [:spec] diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/decoding_benchmark.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/decoding_benchmark.rb new file mode 100644 index 00000000..447d7c7e --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/decoding_benchmark.rb @@ -0,0 +1,38 @@ +require 'rubygems' +require 'bundler' + +Bundler.setup + +require 'benchmark' +require 'chunky_png' + +def image_file(name) + File.join(File.dirname(__FILE__), '..', 'spec', 'resources', name) +end + +def image_data(name) + data = nil + File.open(image_file(name), 'rb') { |f| data = f.read } + data +end + +no_filtering_stream = image_data('pixelstream_fast_rgba.png') +up_filtering_stream = image_data('pixelstream_reference.png') +paeth_filtering_stream = image_data('pixelstream_best_compression.png') +rgba_pixelstream = image_data('pixelstream.rgba') +rgb_pixelstream = image_data('pixelstream.rgb') + +n = (ENV['N'] || '5').to_i + +puts "---------------------------------------------" +puts "ChunkyPNG (#{ChunkyPNG::VERSION}) decoding benchmark (n=#{n})" +puts "---------------------------------------------" +puts + +Benchmark.bmbm do |x| + x.report('PNG - no filtering') { n.times { ChunkyPNG::Image.from_blob(no_filtering_stream) } } + x.report('PNG - UP filtering') { n.times { ChunkyPNG::Image.from_blob(up_filtering_stream) } } + x.report('PNG - PAETH filtering') { n.times { ChunkyPNG::Image.from_blob(paeth_filtering_stream) } } + x.report('From RGBA pixelstream') { n.times { ChunkyPNG::Image.from_rgba_stream(240, 180, rgba_pixelstream) } } + x.report('From RGB pixelstream') { n.times { ChunkyPNG::Image.from_rgb_stream(240, 180, rgb_pixelstream) } } +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/encoding_benchmark.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/encoding_benchmark.rb new file mode 100644 index 00000000..782b5c74 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/encoding_benchmark.rb @@ -0,0 +1,42 @@ +require 'rubygems' +require 'bundler' + +Bundler.setup + +require 'benchmark' +require 'chunky_png' + +image = ChunkyPNG::Image.new(240, 180, ChunkyPNG::Color::TRANSPARENT) + +# set some random pixels +image[10, 20] = ChunkyPNG::Color.rgba(255, 0, 0, 255) +image[50, 87] = ChunkyPNG::Color.rgba( 0, 255, 0, 255) +image[33, 99] = ChunkyPNG::Color.rgba( 0, 0, 255, 255) + +n = (ENV['N'] || '5').to_i + +puts "---------------------------------------------" +puts "ChunkyPNG (#{ChunkyPNG::VERSION}) encoding benchmark (n=#{n})" +puts "---------------------------------------------" +puts + +Benchmark.bmbm do |x| + x.report('Autodetect (indexed)') { n.times { image.to_blob } } + + # Presets + x.report(':no_compression') { n.times { image.to_blob(:no_compression) } } + x.report(':fast_rgba') { n.times { image.to_blob(:fast_rgba) } } + x.report(':fast_rgb') { n.times { image.to_blob(:fast_rgb) } } + x.report(':good_compression') { n.times { image.to_blob(:good_compression) } } + x.report(':best_compression') { n.times { image.to_blob(:best_compression) } } + + # Some options + x.report(':rgb') { n.times { image.to_blob(:color_mode => ChunkyPNG::COLOR_TRUECOLOR) } } + x.report(':rgba') { n.times { image.to_blob(:color_mode => ChunkyPNG::COLOR_TRUECOLOR_ALPHA) } } + x.report(':indexed') { n.times { image.to_blob(:color_mode => ChunkyPNG::COLOR_INDEXED) } } + x.report(':interlaced') { n.times { image.to_blob(:interlaced => true) } } + + # Exports + x.report('to RGBA pixelstream') { n.times { image.to_rgba_stream } } + x.report('to RGB pixelstream') { n.times { image.to_rgb_stream } } +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/filesize_benchmark.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/filesize_benchmark.rb new file mode 100644 index 00000000..a51e7c79 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/benchmarks/filesize_benchmark.rb @@ -0,0 +1,30 @@ +require 'rubygems' +require 'bundler' + +Bundler.setup + +require 'benchmark' +require 'chunky_png' + +files = ['pixelstream_reference.png', 'operations.png', 'clock_stubbed.png'] + +def encode_png(image, constraints = {}) + filesize = nil + time = Benchmark.realtime { filesize = image.to_blob(constraints).bytesize } + [filesize, time] +end + +files.each do |file| + filename = File.join(File.dirname(__FILE__), '..', 'spec', 'resources', file) + image = ChunkyPNG::Canvas.from_file(filename) + + puts "#{file}: #{image.width}x#{image.height} - #{image.palette.size} colors" + puts "------------------------------------------------" + puts " : %8d bytes in %0.4fs" % encode_png(image) + puts ":no_compression : %8d bytes in %0.4fs" % encode_png(image, :no_compression) + puts ":fast_rgba : %8d bytes in %0.4fs" % encode_png(image, :fast_rgba) + puts ":fast_rgb : %8d bytes in %0.4fs" % encode_png(image, :fast_rgb) + puts ":good_compression : %8d bytes in %0.4fs" % encode_png(image, :good_compression) + puts ":best_compression : %8d bytes in %0.4fs" % encode_png(image, :best_compression) + puts +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/chunky_png.gemspec b/lib/ruby/gem/gems/chunky_png-0.11.1/chunky_png.gemspec new file mode 100644 index 00000000..496b8d75 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/chunky_png.gemspec @@ -0,0 +1,43 @@ +Gem::Specification.new do |s| + s.name = 'chunky_png' + + # Do not change the version and date fields by hand. This will be done + # automatically by the gem release script. + s.version = "0.11.1" + s.date = "2010-11-16" + + s.summary = "Pure ruby library for read/write, chunk-level access to PNG files" + s.description = <<-EOT + This pure Ruby library can read and write PNG images without depending on an external + image library, like RMagick. It tries to be memory efficient and reasonably fast. + + It supports reading and writing all PNG variants that are defined in the specification, + with one limitation: only 8-bit color depth is supported. It supports all transparency, + interlacing and filtering options the PNG specifications allows. It can also read and + write textual metadata from PNG files. Low-level read/write access to PNG chunks is + also possible. + + This library supports simple drawing on the image canvas and simple operations like + alpha composition and cropping. Finally, it can import from and export to RMagick for + interoperability. + + Also, have a look at OilyPNG at http://github.com/wvanbergen/oily_png. OilyPNG is a + drop in mixin module that implements some of the ChunkyPNG algorithms in C, which + provides a massive speed boost to encoding and decoding. + EOT + + s.authors = ['Willem van Bergen'] + s.email = ['willem@railsdoctors.com'] + s.homepage = 'http://wiki.github.com/wvanbergen/chunky_png' + + s.add_development_dependency('rake') + s.add_development_dependency('rspec', '~> 2.1') + + s.rdoc_options << '--title' << s.name << '--main' << 'README.rdoc' << '--line-numbers' << '--inline-source' + s.extra_rdoc_files = ['README.rdoc', 'BENCHMARKS.rdoc'] + + # Do not change the files and test_files fields by hand. This will be done + # automatically by the gem release script. + s.files = %w(.gitignore .infinity_test BENCHMARKS.rdoc Gemfile Gemfile.lock LICENSE README.rdoc Rakefile benchmarks/decoding_benchmark.rb benchmarks/encoding_benchmark.rb benchmarks/filesize_benchmark.rb chunky_png.gemspec lib/chunky_png.rb lib/chunky_png/canvas.rb lib/chunky_png/canvas/adam7_interlacing.rb lib/chunky_png/canvas/drawing.rb lib/chunky_png/canvas/operations.rb lib/chunky_png/canvas/png_decoding.rb lib/chunky_png/canvas/png_encoding.rb lib/chunky_png/canvas/stream_exporting.rb lib/chunky_png/canvas/stream_importing.rb lib/chunky_png/chunk.rb lib/chunky_png/color.rb lib/chunky_png/compatibility.rb lib/chunky_png/datastream.rb lib/chunky_png/image.rb lib/chunky_png/palette.rb lib/chunky_png/rmagick.rb spec/chunky_png/canvas/adam7_interlacing_spec.rb spec/chunky_png/canvas/drawing_spec.rb spec/chunky_png/canvas/operations_spec.rb spec/chunky_png/canvas/png_decoding_spec.rb spec/chunky_png/canvas/png_encoding_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png_spec.rb spec/png_suite/background_chunks/bgai4a08.png spec/png_suite/background_chunks/bgai4a16.png spec/png_suite/background_chunks/bgan6a08.png spec/png_suite/background_chunks/bgan6a16.png spec/png_suite/background_chunks/bgbn4a08.png spec/png_suite/background_chunks/bggn4a16.png spec/png_suite/background_chunks/bgwn6a08.png spec/png_suite/background_chunks/bgyn6a16.png spec/png_suite/basic/basi0g01.png spec/png_suite/basic/basi0g01.rgba spec/png_suite/basic/basi0g02.png spec/png_suite/basic/basi0g02.rgba spec/png_suite/basic/basi0g04.png spec/png_suite/basic/basi0g04.rgba spec/png_suite/basic/basi0g08.png spec/png_suite/basic/basi0g08.rgba spec/png_suite/basic/basi0g16.png spec/png_suite/basic/basi0g16.rgba spec/png_suite/basic/basi2c08.png spec/png_suite/basic/basi2c08.rgba spec/png_suite/basic/basi2c16.png spec/png_suite/basic/basi2c16.rgba spec/png_suite/basic/basi3p01.png spec/png_suite/basic/basi3p01.rgba spec/png_suite/basic/basi3p02.png spec/png_suite/basic/basi3p02.rgba spec/png_suite/basic/basi3p04.png spec/png_suite/basic/basi3p04.rgba spec/png_suite/basic/basi3p08.png spec/png_suite/basic/basi3p08.rgba spec/png_suite/basic/basi4a08.png spec/png_suite/basic/basi4a08.rgba spec/png_suite/basic/basi4a16.png spec/png_suite/basic/basi4a16.rgba spec/png_suite/basic/basi6a08.png spec/png_suite/basic/basi6a08.rgba spec/png_suite/basic/basi6a16.png spec/png_suite/basic/basi6a16.rgba spec/png_suite/basic/basn0g01.png spec/png_suite/basic/basn0g01.rgba spec/png_suite/basic/basn0g02.png spec/png_suite/basic/basn0g02.rgba spec/png_suite/basic/basn0g04.png spec/png_suite/basic/basn0g04.rgba spec/png_suite/basic/basn0g08.png spec/png_suite/basic/basn0g08.rgba spec/png_suite/basic/basn0g16.png spec/png_suite/basic/basn0g16.rgba spec/png_suite/basic/basn2c08.png spec/png_suite/basic/basn2c08.rgba spec/png_suite/basic/basn2c16.png spec/png_suite/basic/basn2c16.rgba spec/png_suite/basic/basn3p01.png spec/png_suite/basic/basn3p01.rgba spec/png_suite/basic/basn3p02.png spec/png_suite/basic/basn3p02.rgba spec/png_suite/basic/basn3p04.png spec/png_suite/basic/basn3p04.rgba spec/png_suite/basic/basn3p08.png spec/png_suite/basic/basn3p08.rgba spec/png_suite/basic/basn4a08.png spec/png_suite/basic/basn4a08.rgba spec/png_suite/basic/basn4a16.png spec/png_suite/basic/basn4a16.rgba spec/png_suite/basic/basn6a08.png spec/png_suite/basic/basn6a08.rgba spec/png_suite/basic/basn6a16.png spec/png_suite/basic/basn6a16.rgba spec/png_suite/broken/x00n0g01.png spec/png_suite/broken/xcrn0g04.png spec/png_suite/broken/xlfn0g04.png spec/png_suite/chunk_ordering/oi1n0g16.png spec/png_suite/chunk_ordering/oi1n2c16.png spec/png_suite/chunk_ordering/oi2n0g16.png spec/png_suite/chunk_ordering/oi2n2c16.png spec/png_suite/chunk_ordering/oi4n0g16.png spec/png_suite/chunk_ordering/oi4n2c16.png spec/png_suite/chunk_ordering/oi9n0g16.png spec/png_suite/chunk_ordering/oi9n2c16.png spec/png_suite/compression_levels/z00n2c08.png spec/png_suite/compression_levels/z03n2c08.png spec/png_suite/compression_levels/z06n2c08.png spec/png_suite/compression_levels/z09n2c08.png spec/png_suite/filtering/f00n0g08.png spec/png_suite/filtering/f00n0g08.rgba spec/png_suite/filtering/f00n0g08_reference.png spec/png_suite/filtering/f00n0g08_reference.rgba spec/png_suite/filtering/f00n2c08.png spec/png_suite/filtering/f00n2c08.rgba spec/png_suite/filtering/f00n2c08_reference.png spec/png_suite/filtering/f00n2c08_reference.rgba spec/png_suite/filtering/f01n0g08.png spec/png_suite/filtering/f01n0g08.rgba spec/png_suite/filtering/f01n0g08_reference.png spec/png_suite/filtering/f01n0g08_reference.rgba spec/png_suite/filtering/f01n2c08.png spec/png_suite/filtering/f01n2c08.rgba spec/png_suite/filtering/f01n2c08_reference.png spec/png_suite/filtering/f01n2c08_reference.rgba spec/png_suite/filtering/f02n0g08.png spec/png_suite/filtering/f02n0g08.rgba spec/png_suite/filtering/f02n0g08_reference.png spec/png_suite/filtering/f02n0g08_reference.rgba spec/png_suite/filtering/f02n2c08.png spec/png_suite/filtering/f02n2c08.rgba spec/png_suite/filtering/f02n2c08_reference.png spec/png_suite/filtering/f02n2c08_reference.rgba spec/png_suite/filtering/f03n0g08.png spec/png_suite/filtering/f03n0g08.rgba spec/png_suite/filtering/f03n0g08_reference.png spec/png_suite/filtering/f03n0g08_reference.rgba spec/png_suite/filtering/f03n2c08.png spec/png_suite/filtering/f03n2c08.rgba spec/png_suite/filtering/f03n2c08_reference.png spec/png_suite/filtering/f03n2c08_reference.rgba spec/png_suite/filtering/f04n0g08.png spec/png_suite/filtering/f04n0g08.rgba spec/png_suite/filtering/f04n0g08_reference.png spec/png_suite/filtering/f04n0g08_reference.rgba spec/png_suite/filtering/f04n2c08.png spec/png_suite/filtering/f04n2c08.rgba spec/png_suite/filtering/f04n2c08_reference.png spec/png_suite/filtering/f04n2c08_reference.rgba spec/png_suite/gamma/g03n0g16.png spec/png_suite/gamma/g03n2c08.png spec/png_suite/gamma/g03n3p04.png spec/png_suite/gamma/g04n0g16.png spec/png_suite/gamma/g04n2c08.png spec/png_suite/gamma/g04n3p04.png spec/png_suite/gamma/g05n0g16.png spec/png_suite/gamma/g05n2c08.png spec/png_suite/gamma/g05n3p04.png spec/png_suite/gamma/g07n0g16.png spec/png_suite/gamma/g07n2c08.png spec/png_suite/gamma/g07n3p04.png spec/png_suite/gamma/g10n0g16.png spec/png_suite/gamma/g10n2c08.png spec/png_suite/gamma/g10n3p04.png spec/png_suite/gamma/g25n0g16.png spec/png_suite/gamma/g25n2c08.png spec/png_suite/gamma/g25n3p04.png spec/png_suite/metadata/cm0n0g04.png spec/png_suite/metadata/cm7n0g04.png spec/png_suite/metadata/cm9n0g04.png spec/png_suite/other/ccwn2c08.png spec/png_suite/other/ccwn3p08.png spec/png_suite/other/cdfn2c08.png spec/png_suite/other/cdhn2c08.png spec/png_suite/other/cdsn2c08.png spec/png_suite/other/cdun2c08.png spec/png_suite/other/ch1n3p04.png spec/png_suite/other/ch2n3p08.png spec/png_suite/other/cs3n2c16.png spec/png_suite/other/cs3n3p08.png spec/png_suite/other/cs5n2c08.png spec/png_suite/other/cs5n3p08.png spec/png_suite/other/cs8n2c08.png spec/png_suite/other/cs8n3p08.png spec/png_suite/other/ct0n0g04.png spec/png_suite/other/ct1n0g04.png spec/png_suite/other/ctzn0g04.png spec/png_suite/other/pp0n2c16.png spec/png_suite/other/pp0n6a08.png spec/png_suite/other/ps1n0g08.png spec/png_suite/other/ps1n2c16.png spec/png_suite/other/ps2n0g08.png spec/png_suite/other/ps2n2c16.png spec/png_suite/sizes/s01i3p01.png spec/png_suite/sizes/s01n3p01.png spec/png_suite/sizes/s02i3p01.png spec/png_suite/sizes/s02n3p01.png spec/png_suite/sizes/s03i3p01.png spec/png_suite/sizes/s03n3p01.png spec/png_suite/sizes/s04i3p01.png spec/png_suite/sizes/s04n3p01.png spec/png_suite/sizes/s05i3p02.png spec/png_suite/sizes/s05n3p02.png spec/png_suite/sizes/s06i3p02.png spec/png_suite/sizes/s06n3p02.png spec/png_suite/sizes/s07i3p02.png spec/png_suite/sizes/s07n3p02.png spec/png_suite/sizes/s08i3p02.png spec/png_suite/sizes/s08n3p02.png spec/png_suite/sizes/s09i3p02.png spec/png_suite/sizes/s09n3p02.png spec/png_suite/sizes/s32i3p04.png spec/png_suite/sizes/s32n3p04.png spec/png_suite/sizes/s33i3p04.png spec/png_suite/sizes/s33n3p04.png spec/png_suite/sizes/s34i3p04.png spec/png_suite/sizes/s34n3p04.png spec/png_suite/sizes/s35i3p04.png spec/png_suite/sizes/s35n3p04.png spec/png_suite/sizes/s36i3p04.png spec/png_suite/sizes/s36n3p04.png spec/png_suite/sizes/s37i3p04.png spec/png_suite/sizes/s37n3p04.png spec/png_suite/sizes/s38i3p04.png spec/png_suite/sizes/s38n3p04.png spec/png_suite/sizes/s39i3p04.png spec/png_suite/sizes/s39n3p04.png spec/png_suite/sizes/s40i3p04.png spec/png_suite/sizes/s40n3p04.png spec/png_suite/transparency/tbbn1g04.png spec/png_suite/transparency/tbbn2c16.png spec/png_suite/transparency/tbbn3p08.png spec/png_suite/transparency/tbgn2c16.png spec/png_suite/transparency/tbgn3p08.png spec/png_suite/transparency/tbrn2c08.png spec/png_suite/transparency/tbwn1g16.png spec/png_suite/transparency/tbwn3p08.png spec/png_suite/transparency/tbyn3p08.png spec/png_suite/transparency/tp0n1g08.png spec/png_suite/transparency/tp0n2c08.png spec/png_suite/transparency/tp0n3p08.png spec/png_suite/transparency/tp1n3p08.png spec/png_suite_spec.rb spec/resources/adam7.png spec/resources/clock.png spec/resources/clock_base.png spec/resources/clock_flip_horizontally.png spec/resources/clock_flip_vertically.png spec/resources/clock_mask.png spec/resources/clock_mask_updated.png spec/resources/clock_rotate_180.png spec/resources/clock_rotate_left.png spec/resources/clock_rotate_right.png spec/resources/clock_stubbed.png spec/resources/clock_updated.png spec/resources/composited.png spec/resources/cropped.png spec/resources/damaged_chunk.png spec/resources/damaged_signature.png spec/resources/lines.png spec/resources/operations.png spec/resources/pixelstream.rgb spec/resources/pixelstream.rgba spec/resources/pixelstream_best_compression.png spec/resources/pixelstream_fast_rgba.png spec/resources/pixelstream_reference.png spec/resources/rect.png spec/resources/replaced.png spec/resources/text_chunk.png spec/resources/ztxt_chunk.png spec/spec_helper.rb tasks/benchmarks.rake tasks/github-gem.rake) + s.test_files = %w(spec/chunky_png/canvas/adam7_interlacing_spec.rb spec/chunky_png/canvas/drawing_spec.rb spec/chunky_png/canvas/operations_spec.rb spec/chunky_png/canvas/png_decoding_spec.rb spec/chunky_png/canvas/png_encoding_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png_spec.rb spec/png_suite_spec.rb) +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png.rb new file mode 100644 index 00000000..c20c2fdb --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png.rb @@ -0,0 +1,87 @@ +require 'set' +require 'zlib' +require 'stringio' +require 'enumerator' + +require 'chunky_png/compatibility' +require 'chunky_png/datastream' +require 'chunky_png/chunk' +require 'chunky_png/palette' +require 'chunky_png/color' +require 'chunky_png/canvas/png_encoding' +require 'chunky_png/canvas/png_decoding' +require 'chunky_png/canvas/adam7_interlacing' +require 'chunky_png/canvas/stream_exporting' +require 'chunky_png/canvas/stream_importing' +require 'chunky_png/canvas/operations' +require 'chunky_png/canvas/drawing' +require 'chunky_png/canvas' +require 'chunky_png/image' + +# ChunkyPNG - the pury ruby library to access PNG files. +# +# The ChunkyPNG module defines some constants that are used in the +# PNG specification. +# +# @author Willem van Bergen +module ChunkyPNG + + # The current version of ChunkyPNG. This value will be updated automatically + # by them gem:release rake task. + VERSION = "0.11.1" + + ################################################### + # PNG international standard defined constants + ################################################### + + COLOR_GRAYSCALE = 0 + COLOR_TRUECOLOR = 2 + COLOR_INDEXED = 3 + COLOR_GRAYSCALE_ALPHA = 4 + COLOR_TRUECOLOR_ALPHA = 6 + + FILTERING_DEFAULT = 0 + + COMPRESSION_DEFAULT = 0 + + INTERLACING_NONE = 0 + INTERLACING_ADAM7 = 1 + + FILTER_NONE = 0 + FILTER_SUB = 1 + FILTER_UP = 2 + FILTER_AVERAGE = 3 + FILTER_PAETH = 4 + + ################################################### + # ChunkyPNG exception classes + ################################################### + + # Default exception class for ChunkyPNG + class Exception < ::StandardError + end + + # Exception that is raised for an unsopported PNG image. + class NotSupported < ChunkyPNG::Exception + end + + # Exception that is raised if the PNG signature is not encountered at the + # beginning of the file. + class SignatureMismatch < ChunkyPNG::Exception + end + + # Exception that is raised if the CRC check for a block failes + class CRCMismatch < ChunkyPNG::Exception + end + + # Exception that is raised if an expectation fails. + class ExpectationFailed < ChunkyPNG::Exception + end + + # Exception that is raised if an expectation fails. + class OutOfBounds < ChunkyPNG::ExpectationFailed + end + + EMPTY_BYTEARRAY = String.method_defined?(:force_encoding) ? "".force_encoding('ASCII-8BIT').freeze : "".freeze + EXTRA_BYTE = String.method_defined?(:force_encoding) ? "\0".force_encoding('ASCII-8BIT') : "\0" +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas.rb new file mode 100644 index 00000000..9e7fc2e4 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas.rb @@ -0,0 +1,264 @@ +module ChunkyPNG + + # The ChunkPNG::Canvas class represents a raster image as a matrix of + # pixels. + # + # This class supports loading a Canvas from a PNG datastream, and creating a + # {ChunkyPNG::Datastream PNG datastream} based on this matrix. ChunkyPNG + # only supports 8-bit color depth, otherwise all of the PNG format's + # variations are supported for both reading and writing. + # + # This class offers per-pixel access to the matrix by using x,y coordinates. + # It uses a palette (see {ChunkyPNG::Palette}) to keep track of the + # different colors used in this matrix. + # + # The pixels in the canvas are stored as 4-byte fixnum, representing 32-bit + # RGBA colors (8 bit per channel). The module {ChunkyPNG::Color} is provided + # to work more easily with these number as color values. + # + # The module {ChunkyPNG::Canvas::Operations} is imported for operations on + # the whole canvas, like cropping and alpha compositing. Simple drawing + # functions are imported from the {ChunkyPNG::Canvas::Drawing} module. + class Canvas + + include PNGEncoding + extend PNGDecoding + extend Adam7Interlacing + + include StreamExporting + extend StreamImporting + + include Operations + include Drawing + + # @return [Integer] The number of columns in this canvas + attr_reader :width + + # @return [Integer] The number of rows in this canvas + attr_reader :height + + # @return [Array] The list of pixels in this canvas. + # This array always should have +width * height+ elements. + attr_reader :pixels + + + ################################################################# + # CONSTRUCTORS + ################################################################# + + # Initializes a new Canvas instance + # @param [Integer] width The width in pixels of this canvas + # @param [Integer] width The height in pixels of this canvas + # @param [ChunkyPNG::Pixel, Array] initial The initial value of te pixels: + # + # * If a color is passed to this parameter, this color will be used as background color. + # + # * If an array of pixels is provided, these pixels will be used as initial value. Note + # that the amount of pixels in this array should equal +width * height+. + def initialize(width, height, initial = ChunkyPNG::Color::TRANSPARENT) + + @width, @height = width, height + + if initial.kind_of?(Integer) + @pixels = Array.new(width * height, initial) + elsif initial.kind_of?(Array) && initial.size == width * height + @pixels = initial + else + raise ChunkyPNG::ExpectationFailed, "Cannot use this value as initial canvas: #{initial.inspect}!" + end + end + + # Initializes a new Canvas instances when being cloned. + # @param [ChunkyPNG::Canvas] other The canvas to duplicate + def initialize_copy(other) + @width, @height = other.width, other.height + @pixels = other.pixels.dup + end + + # Creates a new canvas instance by duplicating another instance. + # @param [ChunkyPNG::Canvas] canvas The canvas to duplicate + # @return [ChunkyPNG::Canvas] The newly constructed canvas instance. + def self.from_canvas(canvas) + self.new(canvas.width, canvas.height, canvas.pixels.dup) + end + + + ################################################################# + # PROPERTIES + ################################################################# + + # Returns the size ([width, height]) for this canvas. + # @return Array An array with the width and height of this canvas as elements. + def size + [@width, @height] + end + + # Replaces a single pixel in this canvas. + # @param [Integer] x The x-coordinate of the pixel (column) + # @param [Integer] y The y-coordinate of the pixel (row) + # @param [ChunkyPNG::Color] pixel The new pixel for the provided coordinates. + # @return [Integer] the new pixel value, i.e. color. + # @raise [ChunkyPNG::OutOfBounds] when the coordinates are outside of the image's dimensions. + def []=(x, y, color) + assert_xy!(x, y) + @pixels[y * width + x] = color + end + + # Replaces a single pixel in this canvas, without bounds checking. + # @param (see #[]=) + # @return [Integer] the new pixel value, i.e. color. + def set_pixel(x, y, color) + @pixels[y * width + x] = color + end + + # Returns a single pixel from this canvas. + # @param [Integer] x The x-coordinate of the pixel (column) + # @param [Integer] y The y-coordinate of the pixel (row) + # @return [ChunkyPNG::Color] The current pixel at the provided coordinates. + # @raise [ChunkyPNG::OutOfBounds] when the coordinates are outside of the image's dimensions. + def [](x, y) + assert_xy!(x, y) + @pixels[y * width + x] + end + + # Returns a single pixel from this canvas, without checking bounds. + # @param (see #[]) + # @return [ChunkyPNG::Color] The current pixel at the provided coordinates. + def get_pixel(x, y) + @pixels[y * width + x] + end + + # Returns an extracted row as vector of pixels + # @param [Integer] y The 0-based row index + # @return [Array] The vector of pixels in the requested row + def row(y) + assert_y!(y) + pixels.slice(y * width, width) + end + + # Returns an extracted column as vector of pixels. + # @param [Integer] x The 0-based column index. + # @return [Array] The vector of pixels in the requested column. + def column(x) + assert_x!(x) + (0...height).inject([]) { |pixels, y| pixels << get_pixel(x, y) } + end + + # Replaces a row of pixels on this canvas. + # @param [Integer] y The 0-based row index. + # @param [Array] vector The vector of pixels to replace the row with. + def replace_row!(y, vector) + assert_y!(y) && assert_width!(vector.length) + pixels[y * width, width] = vector + end + + # Replaces a column of pixels on this canvas. + # @param [Integer] x The 0-based column index. + # @param [Array] vector The vector of pixels to replace the column with. + def replace_column!(x, vector) + assert_x!(x) && assert_height!(vector.length) + for y in 0...height do + set_pixel(x, y, vector[y]) + end + end + + # Checks whether the given coordinates are in the range of the canvas + # @param [Integer] x The x-coordinate of the pixel (column) + # @param [Integer] y The y-coordinate of the pixel (row) + # @return [true, false] True if the x and y coordinate are in the range + # of this canvas. + def include_xy?(x, y) + include_x?(x) && include_y?(y) + end + + alias_method :include?, :include_xy? + + # Checks whether the given y-coordinate is in the range of the canvas + # @param [Integer] y The y-coordinate of the pixel (row) + # @return [true, false] True if the y-coordinate is in the range of this canvas. + def include_y?(y) + y >= 0 && y < height + end + + # Checks whether the given x-coordinate is in the range of the canvas + # @param [Integer] x The y-coordinate of the pixel (column) + # @return [true, false] True if the x-coordinate is in the range of this canvas. + def include_x?(x) + x >= 0 && x < width + end + + # Returns the palette used for this canvas. + # @return [ChunkyPNG::Palette] A pallete which contains all the colors that are + # being used for this image. + def palette + ChunkyPNG::Palette.from_canvas(self) + end + + # Equality check to compare this canvas with other matrices. + # @param other The object to compare this Matrix to. + # @return [true, false] True if the size and pixel values of the other canvas + # are exactly the same as this canvas's size and pixel values. + def eql?(other) + other.kind_of?(self.class) && other.pixels == self.pixels && + other.width == self.width && other.height == self.height + end + + alias :== :eql? + + ################################################################# + # EXPORTING + ################################################################# + + # Creates an ChunkyPNG::Image object from this canvas. + # @return [ChunkyPNG::Image] This canvas wrapped in an Image instance. + def to_image + ChunkyPNG::Image.from_canvas(self) + end + + # Alternative implementation of the inspect method. + # @return [String] A nicely formatted string representation of this canvas. + def inspect + inspected = "<#{self.class.name} #{width}x#{height} [" + for y in 0...height + inspected << "\n\t[" << row(y).map { |p| ChunkyPNG::Color.to_hex(p) }.join(' ') << ']' + end + inspected << "\n]>" + end + + protected + + # Throws an exception if the x-coordinate is out of bounds. + def assert_x!(x) + raise ChunkyPNG::OutOfBounds, "Column index out of bounds!" unless include_x?(x) + return true + end + + # Throws an exception if the y-coordinate is out of bounds. + def assert_y!(y) + raise ChunkyPNG::OutOfBounds, "Row index out of bounds!" unless include_y?(y) + return true + end + + # Throws an exception if the x- or y-coordinate is out of bounds. + def assert_xy!(x, y) + raise ChunkyPNG::OutOfBounds, "Coordinates out of bounds!" unless include_xy?(x, y) + return true + end + + def assert_height!(vector_length) + raise ChunkyPNG::ExpectationFailed, "The length of the vector does not match the canvas height!" if height != vector_length + return true + end + + def assert_width!(vector_length) + raise ChunkyPNG::ExpectationFailed, "The length of the vector does not match the canvas width!" if width != vector_length + return true + end + + def assert_size!(matrix_width, matrix_height) + raise ChunkyPNG::ExpectationFailed, "The width of the matrix does not match the canvas width!" if width != matrix_width + raise ChunkyPNG::ExpectationFailed, "The height of the matrix does not match the canvas height!" if height != matrix_height + return true + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/adam7_interlacing.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/adam7_interlacing.rb new file mode 100644 index 00000000..7ad57041 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/adam7_interlacing.rb @@ -0,0 +1,72 @@ +module ChunkyPNG + class Canvas + + # Methods for decoding and encoding Adam7 interlacing. + # + # Adam7 interlacing extractg 7 pass images out of a single image, that can be encoded to a + # stream separately so the image can be built up progressively. The module is included into + # ChunkyPNG canvas and is used to extract the pass images from the original image, or to + # reconstruct an original image from separate pass images. + module Adam7Interlacing + + # Returns an array with the x-shift, x-offset, y-shift and y-offset for the requested pass. + # @param [Integer] pass The pass number, should be in 0..6. + def adam7_multiplier_offset(pass) + [3 - (pass >> 1), (pass & 1 == 0) ? 0 : 8 >> ((pass + 1) >> 1), + pass == 0 ? 3 : 3 - ((pass - 1) >> 1), (pass == 0 || pass & 1 == 1) ? 0 : 8 >> (pass >> 1)] + end + + # Returns the pixel dimensions of the requested pass. + # @param [Integer] pass The pass number, should be in 0..6. + # @param [Integer] original_width The width of the original image. + # @param [Integer] original_height The height of the original image. + def adam7_pass_size(pass, original_width, original_height) + x_shift, x_offset, y_shift, y_offset = adam7_multiplier_offset(pass) + [ (original_width - x_offset + (1 << x_shift) - 1) >> x_shift, + (original_height - y_offset + (1 << y_shift) - 1) >> y_shift] + end + + # Returns an array of the dimension of all the pass images. + # @param [Integer] original_width The width of the original image. + # @param [Integer] original_height The height of the original image. + # @return [Array>] Returns an array with 7 pairs of dimensions. + # @see #adam7_pass_size + def adam7_pass_sizes(original_width, original_height) + (0...7).map { |pass| adam7_pass_size(pass, original_width, original_height) } + end + + # Merges a pass image into a total image that is being constructed. + # @param [Integer] pass The pass number, should be in 0..6. + # @param [ChunkyPNG::Canvas] canvas The image that is being constructed. + # @param [ChunkyPNG::Canvas] subcanvas The pass image that should be merged + def adam7_merge_pass(pass, canvas, subcanvas) + x_shift, x_offset, y_shift, y_offset = adam7_multiplier_offset(pass) + for y in 0...subcanvas.height do + for x in 0...subcanvas.width do + new_x = (x << x_shift) | x_offset + new_y = (y << y_shift) | y_offset + canvas[new_x, new_y] = subcanvas[x, y] + end + end + end + + # Extracts a pass from a complete image + # @param [Integer] pass The pass number, should be in 0..6. + # @param [ChunkyPNG::Canvas] canvas The image that is being deconstructed. + # @return [ChunkyPNG::Canvas] The extracted pass image. + def adam7_extract_pass(pass, canvas) + x_shift, x_offset, y_shift, y_offset = adam7_multiplier_offset(pass) + sm_pixels = [] + + y_offset.step(canvas.height - 1, 1 << y_shift) do |y| + x_offset.step(canvas.width - 1, 1 << x_shift) do |x| + sm_pixels << canvas[x, y] + end + end + + new_canvas_args = adam7_pass_size(pass, canvas.width, canvas.height) + [sm_pixels] + ChunkyPNG::Canvas.new(*new_canvas_args) + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/drawing.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/drawing.rb new file mode 100644 index 00000000..9cd5b11c --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/drawing.rb @@ -0,0 +1,87 @@ +module ChunkyPNG + class Canvas + + module Drawing + + # Sets a point on the canvas by composing a pixel with its background color. + def point(x, y, color) + set_pixel(x, y, ChunkyPNG::Color.compose(color, get_pixel(x, y))) + end + + # Draws an anti-aliased line using Xiaolin Wu's algorithm. + # + def line_xiaolin_wu(x0, y0, x1, y1, color) + y0, y1, x0, x1 = y1, y0, x1, x0 if y0 > y1 + dx = x1 - x0 + sx = dx < 0 ? -1 : 1 + dx *= sx + dy = y1 - y0 + + if dy == 0 # vertical line + Range.new(*[x0,x1].sort).each do |x| + point(x, y0, color) + end + elsif dx == 0 # horizontal line + (y0..y1).each do |y| + point(x0, y, color) + end + elsif dx == dy # diagonal + x0.step(x1, sx) do |x| + point(x, y0, color) + y0 += 1 + end + + elsif dy > dx # vertical displacement + point(x0, y0, color) + e_acc = 0 + e = ((dx << 16) / dy.to_f).round + (y0...y1-1).each do |i| + e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xffff + x0 = x0 + sx if (e_acc <= e_acc_temp) + w = 0xff - (e_acc >> 8) + point(x0, y0, ChunkyPNG::Color.fade(color, w)) if include_xy?(x0, y0) + y0 = y0 + 1 + point(x0 + sx, y0, ChunkyPNG::Color.fade(color, 0xff - w)) if include_xy?(x0 + sx, y0) + end + point(x1, y1, color) + + else # horizontal displacement + point(x0, y0, color) + e_acc = 0 + e = (dy << 16) / dx + (dx - 1).downto(0) do |i| + e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xffff + y0 += 1 if (e_acc <= e_acc_temp) + w = 0xff - (e_acc >> 8) + point(x0, y0, ChunkyPNG::Color.fade(color, w)) if include_xy?(x0, y0) + x0 += sx + point(x0, y0 + 1, ChunkyPNG::Color.fade(color, 0xff - w)) if include_xy?(x0, y0 + 1) + end + point(x1, y1, color) + end + + return self + end + + alias_method :line, :line_xiaolin_wu + + def rect(x0, y0, x1, y1, line_color, fill_color = ChunkyPNG::COLOR::TRANSPARENT) + + # Fill + [x0, x1].min.upto([x0, x1].max) do |x| + [y0, y1].min.upto([y0, y1].max) do |y| + point(x, y, fill_color) + end + end + + # Stroke + line(x0, y0, x0, y1, line_color) + line(x0, y1, x1, y1, line_color) + line(x1, y1, x1, y0, line_color) + line(x1, y0, x0, y0, line_color) + + return self + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/operations.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/operations.rb new file mode 100644 index 00000000..5b428a15 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/operations.rb @@ -0,0 +1,238 @@ +module ChunkyPNG + class Canvas + + # The ChunkyPNG::Canvas::Operations module defines methods to perform operations + # on a {ChunkyPNG::Canvas}. The module is included into the Canvas class so all + # these methods are available on every canvas. + # + # Note that some of these operations modify the canvas, while some operations return + # a new canvas and leave the original intact. + # + # @see ChunkyPNG::Canvas + module Operations + + # Composes another image onto this image using alpha blending. + # + # If you simply want to replace pixels or when the other image does not have + # transparency, it is faster to use {#replace}. + # + # @param [ChunkyPNG::Canvas] other The foreground canvas to compose on the + # current canvas, using alpha compositing. + # @param [Integer] offset_x The x-offset to apply the new forgeround on. + # @param [Integer] offset_y The y-offset to apply the new forgeround on. + # @return [ChunkyPNG::Canvas] Returns itself, but with the other canvas composed onto it. + # @raise [ChunkyPNG::OutOfBounds] when the other canvas doesn't fit on this one, + # given the offset and size of the other canavs. + # @see #replace + def compose(other, offset_x = 0, offset_y = 0) + check_size_constraints!(other, offset_x, offset_y) + + for y in 0...other.height do + for x in 0...other.width do + set_pixel(x + offset_x, y + offset_y, ChunkyPNG::Color.compose(other.get_pixel(x, y), get_pixel(x + offset_x, y + offset_y))) + end + end + self + end + + # Replaces pixels on this image by pixels from another pixels, on a given offset. + # + # This will completely replace the pixels of the background image. If you want to blend + # them with semi-transparent pixels from the foreground image, see {#compose}. + # + # @return [ChunkyPNG::Canvas] Returns itself, but with the other canvas composed onto it. + # @raise [ChunkyPNG::OutOfBounds] when the other canvas doesn't fit on this one, + # given the offset and size of the other canavs. + # @see #compose + def replace(other, offset_x = 0, offset_y = 0) + check_size_constraints!(other, offset_x, offset_y) + + for y in 0...other.height do + pixels[(y + offset_y) * width + offset_x, other.width] = other.pixels[y * other.width, other.width] + end + self + end + + # Crops an image, given the coordinates and size of the image that needs to be cut out. + # This will leave the original image intact and return a new, cropped image with pixels + # copied from the original image. + # + # @param [Integer] x The x-coordinate of the top left corner of the image to be cropped. + # @param [Integer] y The y-coordinate of the top left corner of the image to be cropped. + # @param [Integer] crop_width The width of the image to be cropped. + # @param [Integer] crop_height The height of the image to be cropped. + # @return [ChunkyPNG::Canvas] Returns the newly created cropped image. + # @raise [ChunkyPNG::OutOfBounds] when the crop dimensions plus the given coordinates + # are bigger then the original image. + def crop(x, y, crop_width, crop_height) + + raise ChunkyPNG::OutOfBounds, "Image width is too small!" if crop_width + x > width + raise ChunkyPNG::OutOfBounds, "Image width is too small!" if crop_height + y > height + + new_pixels = [] + for cy in 0...crop_height do + new_pixels += pixels.slice((cy + y) * width + x, crop_width) + end + ChunkyPNG::Canvas.new(crop_width, crop_height, new_pixels) + end + + # Creates a new image, based on the current image but with a new theme color. + # + # This method will replace one color in an image with another image. This is done by + # first extracting the pixels with a color close to the original theme color as a mask + # image, changing the color of this mask image and then apply it on the original image. + # + # Mask extraction works best when the theme colored pixels are clearly distinguishable + # from a background color (preferably white). You can set a tolerance level to influence + # the extraction process. + # + # @param [Integer] old_theme_color The original theme color in this image. + # @param [Integer] new_theme_color The color to replace the old theme color with. + # @param [Integer] The backrgound color opn which the theme colored pixels are placed. + # @param [Integer] tolerance The tolerance level to use when extracting the mask image. Five is + # the default; increase this if the masked image does not extract all the required pixels, + # decrease it if too many pixels get extracted. + # @return [ChunkyPNG::Canvas] Returns itself, but with the theme colored pixels changed. + # @see #change_theme_color! + # @see #change_mask_color! + def change_theme_color!(old_theme_color, new_theme_color, bg_color = ChunkyPNG::Color::WHITE, tolerance = 5) + base, mask = extract_mask(old_theme_color, bg_color, tolerance) + mask.change_mask_color!(new_theme_color) + self.replace(base.compose(mask)) + end + + # Creates a base image and a mask image from an original image that has a particular theme color. + # This can be used to easily change a theme color in an image. + # + # It will extract all the pixels that look like the theme color (with a tolerance level) and put + # these in a mask image. All the other pixels will be stored in a base image. Both images will be + # of the exact same size as the original image. The original image will be left untouched. + # + # The color of the mask image can be changed with {#change_mask_color!}. This new mask image can + # then be composed upon the base image to create an image with a new theme color. A call to + # {#change_theme_color!} will perform this in one go. + # + # @param [Integer] mask_color The current theme color. + # @param [Integer] bg_color The background color on which the theme colored pxiels are applied. + # @param [Integer] tolerance The tolerance level to use when extracting the mask image. Five is + # the default; increase this if the masked image does not extract all the required pixels, + # decrease it if too many pixels get extracted. + # @return [Array] An array with the base canvas and the mask + # canvas as elements. + # @see #change_theme_color! + # @see #change_mask_color! + def extract_mask(mask_color, bg_color = ChunkyPNG::Color::WHITE, tolerance = 5) + base_pixels = [] + mask_pixels = [] + + pixels.each do |pixel| + if ChunkyPNG::Color.alpha_decomposable?(pixel, mask_color, bg_color, tolerance) + mask_pixels << ChunkyPNG::Color.decompose_color(pixel, mask_color, bg_color, tolerance) + base_pixels << bg_color + else + mask_pixels << (mask_color & 0xffffff00) + base_pixels << pixel + end + end + + [ self.class.new(width, height, base_pixels), self.class.new(width, height, mask_pixels) ] + end + + # Changes the color of a mask image. + # + # This method works on acanavs extracte out of another image using the {#extract_mask} method. + # It can then be applied on the extracted base image. See {#change_theme_color!} to perform + # these operations in one go. + # + # @param [Integer] new_color The color to replace the original mask color with. + # @raise [ChunkyPNG::ExpectationFailed] when this canvas is not a mask image, i.e. its palette + # has more than once color, disregarding transparency. + # @see #change_theme_color! + # @see #extract_mask + def change_mask_color!(new_color) + raise ChunkyPNG::ExpectationFailed, "This is not a mask image!" if palette.opaque_palette.size != 1 + pixels.map! { |pixel| (new_color & 0xffffff00) | ChunkyPNG::Color.a(pixel) } + self + end + + # Flips the image horizontally. + # + # This will flip the image on its horizontal axis, e.g. pixels on the top will now + # be pixels on the bottom. Chaining this method twice will return the original canvas. + # This method will leave the original object intact and return a new canvas. + # + # @return [ChunkyPNG::Canvas] The flipped image + def flip_horizontally + self.class.new(width, height).tap do |flipped| + for y in 0...height do + flipped.replace_row!(height - (y + 1), row(y)) + end + end + end + + # Flips the image horizontally. + # + # This will flip the image on its vertical axis, e.g. pixels on the left will now + # be pixels on the right. Chaining this method twice will return the original canvas. + # This method will leave the original object intact and return a new canvas. + # + # @return [ChunkyPNG::Canvas] The flipped image + def flip_vertically + self.class.new(width, height).tap do |flipped| + for x in 0...width do + flipped.replace_column!(width - (x + 1), column(x)) + end + end + end + + # Rotates the image 90 degrees clockwise. + # This method will leave the original object intact and return a new canvas. + # + # @return [ChunkyPNG::Canvas] The rotated image + def rotate_right + self.class.new(height, width).tap do |rotated| + for i in 0...width do + rotated.replace_row!(i, column(i).reverse) + end + end + end + + # Rotates the image 90 degrees counter-clockwise. + # This method will leave the original object intact and return a new canvas. + # + # @return [ChunkyPNG::Canvas] The rotated image. + def rotate_left + self.class.new(height, width).tap do |rotated| + for i in 0...width do + rotated.replace_row!(width - (i + 1), column(i)) + end + end + end + + # Rotates the image 180 degrees. + # This method will leave the original object intact and return a new canvas. + # + # @return [ChunkyPNG::Canvas] The rotated image. + def rotate_180 + self.class.new(width, height).tap do |flipped| + for y in 0...height do + flipped.replace_row!(height - (y + 1), row(y).reverse) + end + end + end + + protected + + # Checks whether another image has the correct dimension to be used for an operation + # on the current image, given an offset coordinate to work with. + # @param [ChunkyPNG::Canvas] other The other canvas + # @param [Integer] offset_x The x offset on which the other image will be applied. + # @param [Integer] offset_y The y offset on which the other image will be applied. + # @raise [ChunkyPNG::OutOfBounds] when the other image doesn't fit. + def check_size_constraints!(other, offset_x, offset_y) + raise ChunkyPNG::OutOfBounds, "Background image width is too small!" if width < other.width + offset_x + raise ChunkyPNG::OutOfBounds, "Background image height is too small!" if height < other.height + offset_y + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/png_decoding.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/png_decoding.rb new file mode 100644 index 00000000..1e38e72e --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/png_decoding.rb @@ -0,0 +1,484 @@ +module ChunkyPNG + class Canvas + + # The PNGDecoding contains methods for decoding PNG datastreams to create a + # Canvas object. The datastream can be provided as filename, string or IO + # stream. + # + # Overview of the decoding process: + # + # * The optional PLTE and tRNS chunk are decoded for the color palette of + # the original image. + # * The contents of the IDAT chunks is combined, and uncompressed using + # Inflate decompression to the image pixelstream. + # * Based on the color mode, width and height of the original image, which + # is read from the PNG header (IHDR chunk), the amount of bytes + # per line is determined. + # * For every line of pixels in the encoded image, the original byte values + # are restored by unapplying the milter method for that line. + # * The read bytes are unfiltered given by the filter function specified by + # the first byte of the line. + # * The unfiltered pixelstream are is into colored pixels, using the color mode. + # * All lines combined to form the original image. + # + # For interlaced images, the original image was split into 7 subimages. + # These images get decoded just like the process above (from step 3), and get + # combined to form the original images. + # + # @see ChunkyPNG::Canvas::PNGEncoding + # @see http://www.w3.org/TR/PNG/ The W3C PNG format specification + module PNGDecoding + + # The palette that is used to decode the image, loading from the PLTE and + # tRNS chunk from the PNG stream. For RGB(A) images, no palette is required. + # @return [ChunkyPNG::Palette] + attr_accessor :decoding_palette + + # Decodes a Canvas from a PNG encoded string. + # @param [String] str The string to read from. + # @return [ChunkyPNG::Canvas] The canvas decoded from the PNG encoded string. + def from_blob(str) + from_datastream(ChunkyPNG::Datastream.from_blob(str)) + end + + alias_method :from_string, :from_blob + + # Decodes a Canvas from a PNG encoded file. + # @param [String] filename The file to read from. + # @return [ChunkyPNG::Canvas] The canvas decoded from the PNG file. + def from_file(filename) + from_datastream(ChunkyPNG::Datastream.from_file(filename)) + end + + # Decodes a Canvas from a PNG encoded stream. + # @param [IO, #read] io The stream to read from. + # @return [ChunkyPNG::Canvas] The canvas decoded from the PNG stream. + def from_io(io) + from_datastream(ChunkyPNG::Datastream.from_io(io)) + end + + alias_method :from_stream, :from_io + + # Decodes the Canvas from a PNG datastream instance. + # @param [ChunkyPNG::Datastream] ds The datastream to decode. + # @return [ChunkyPNG::Canvas] The canvas decoded from the PNG datastream. + def from_datastream(ds) + width = ds.header_chunk.width + height = ds.header_chunk.height + color_mode = ds.header_chunk.color + interlace = ds.header_chunk.interlace + depth = ds.header_chunk.depth + + if width == 0 || height == 0 + raise ExpectationFailed, "Invalid image size, width: #{width}, height: #{height}" + end + + self.decoding_palette = ChunkyPNG::Palette.from_chunks(ds.palette_chunk, ds.transparency_chunk) + decode_png_pixelstream(ds.imagedata, width, height, color_mode, depth, interlace) + end + + # Decodes a canvas from a PNG encoded pixelstream, using a given width, height, + # color mode and interlacing mode. + # @param [String] stream The pixelstream to read from. + # @param [Integer] width The width of the image. + # @param [Integer] width The height of the image. + # @param [Integer] color_mode The color mode of the encoded pixelstream. + # @param [Integer] depth The bit depth of the pixel samples. + # @param [Integer] interlace The interlace method of the encoded pixelstream. + # @return [ChunkyPNG::Canvas] The decoded Canvas instance. + def decode_png_pixelstream(stream, width, height, color_mode, depth, interlace) + raise ChunkyPNG::ExpectationFailed, "This palette is not suitable for decoding!" if decoding_palette && !decoding_palette.can_decode? + case interlace + when ChunkyPNG::INTERLACING_NONE; decode_png_without_interlacing(stream, width, height, color_mode, depth) + when ChunkyPNG::INTERLACING_ADAM7; decode_png_with_adam7_interlacing(stream, width, height, color_mode, depth) + else raise ChunkyPNG::NotSupported, "Don't know how the handle interlacing method #{interlace}!" + end + end + + protected + + # Decodes a canvas from a non-interlaced PNG encoded pixelstream, using a + # given width, height and color mode. + # @param stream (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param width (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param height (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param color_mode (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param depth (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @return (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + def decode_png_without_interlacing(stream, width, height, color_mode, depth) + decode_png_image_pass(stream, width, height, color_mode, depth, 0) + end + + # Decodes a canvas from a Adam 7 interlaced PNG encoded pixelstream, using a + # given width, height and color mode. + # @param stream (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param width (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param height (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param color_mode (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param depth (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @return (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + def decode_png_with_adam7_interlacing(stream, width, height, color_mode, depth) + canvas = new(width, height) + start_pos = 0 + for pass in 0...7 + sm_width, sm_height = adam7_pass_size(pass, width, height) + sm = decode_png_image_pass(stream, sm_width, sm_height, color_mode, depth, start_pos) + adam7_merge_pass(pass, canvas, sm) + start_pos += ChunkyPNG::Color.pass_bytesize(color_mode, depth, sm_width, sm_height) + end + canvas + end + + # Extract 4 consecutive bits from a byte. + # @param [Integer] byte The byte (0..255) value to extract a 4 bit value from. + # @param [Integer] index The index within the byte. This should be either 0 or 2; + # the value will be modded by 2 to enforce this. + # @return [Integer] The extracted 4bit value (0..15) + def decode_png_extract_4bit_value(byte, index) + (index & 0x01 == 0) ? ((byte & 0xf0) >> 4) : (byte & 0x0f) + end + + # Extract 2 consecutive bits from a byte. + # @param [Integer] byte The byte (0..255) value to extract a 2 bit value from. + # @param [Integer] index The index within the byte. This should be either 0, 1, 2, or 3; + # the value will be modded by 4 to enforce this. + # @return [Integer] The extracted 2 bit value (0..3) + def decode_png_extract_2bit_value(byte, index) + bitshift = 6 - ((index & 0x03) << 1) + (byte & (0x03 << bitshift)) >> bitshift + end + + # Extract a bit from a byte on a given index. + # @param [Integer] byte The byte (0..255) value to extract a a bit from. + # @param [Integer] index The index within the byte. This should be 0..7; + # the value will be modded by 8 to enforce this. + # @return [Integer] Either 1 or 0. + def decode_png_extract_1bit_value(byte, index) + bitshift = 7 - (index & 0x07) + (byte & (0x01 << bitshift)) >> bitshift + end + + # Resamples a 16 bit value to an 8 bit value. This will discard some color information. + # @param [Integer] value The 16 bit value to resample. + # @return [Integer] The 8 bit resampled value + def decode_png_resample_16bit_value(value) + value >> 8 + end + + # Resamples a 4 bit value to an 8 bit value. + # @param [Integer] value The 4 bit value to resample. + # @return [Integer] The 8 bit resampled value. + def decode_png_resample_4bit_value(value) + case value + when 0x00; 0 + when 0x01; 17 + when 0x02; 34 + when 0x03; 51 + when 0x04; 68 + when 0x05; 85 + when 0x06; 102 + when 0x07; 119 + when 0x08; 137 + when 0x09; 154 + when 0x0a; 171 + when 0x0b; 188 + when 0x0c; 205 + when 0x0d; 222 + when 0x0e; 239 + when 0x0f; 255 + end + end + + # Resamples a 2 bit value to an 8 bit value. + # @param [Integer] value The 2 bit value to resample. + # @return [Integer] The 8 bit resampled value. + def decode_png_resample_2bit_value(value) + case value + when 0x00; 0x00 + when 0x01; 0x55 + when 0x02; 0xaa + when 0x03; 0xff + end + end + + # Decodes a scanline of a 1-bit, indexed image into a row of pixels. + # @param [String] stream The stream to decode from. + # @param [Integer] pos The position in the stream on qhich the scanline starts (including the filter byte). + # @param [Integer] width The width in pixels of the scanline. + # @return [Array] An array of decoded pixels. + def decode_png_pixels_from_scanline_indexed_1bit(stream, pos, width) + (0...width).map do |index| + palette_pos = decode_png_extract_1bit_value(stream.getbyte(pos + 1 + (index >> 3)), index) + decoding_palette[palette_pos] + end + end + + # Decodes a scanline of a 2-bit, indexed image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_indexed_2bit(stream, pos, width) + (0...width).map do |index| + palette_pos = decode_png_extract_2bit_value(stream.getbyte(pos + 1 + (index >> 2)), index) + decoding_palette[palette_pos] + end + end + + # Decodes a scanline of a 4-bit, indexed image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_indexed_4bit(stream, pos, width) + (0...width).map do |index| + palette_pos = decode_png_extract_4bit_value(stream.getbyte(pos + 1 + (index >> 1)), index) + decoding_palette[palette_pos] + end + end + + # Decodes a scanline of a 8-bit, indexed image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_indexed_8bit(stream, pos, width) + (1..width).map { |i| decoding_palette[stream.getbyte(pos + i)] } + end + + # Decodes a scanline of an 8-bit, true color image with transparency into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_truecolor_alpha_8bit(stream, pos, width) + stream.unpack("@#{pos + 1}N#{width}") + end + + # Decodes a scanline of a 16-bit, true color image with transparency into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_truecolor_alpha_16bit(stream, pos, width) + [].tap do |pixels| + stream.unpack("@#{pos + 1}n#{width * 4}").each_slice(4) do |r, g, b, a| + pixels << ChunkyPNG::Color.rgba(decode_png_resample_16bit_value(r), decode_png_resample_16bit_value(g), + decode_png_resample_16bit_value(b), decode_png_resample_16bit_value(a)) + end + end + end + + # Decodes a scanline of an 8-bit, true color image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_truecolor_8bit(stream, pos, width) + stream.unpack("@#{pos + 1}" << ('NX' * width)).map { |c| c | 0x000000ff } + end + + # Decodes a scanline of a 16-bit, true color image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_truecolor_16bit(stream, pos, width) + [].tap do |pixels| + stream.unpack("@#{pos + 1}n#{width * 3}").each_slice(3) do |r, g, b| + pixels << ChunkyPNG::Color.rgb(decode_png_resample_16bit_value(r), decode_png_resample_16bit_value(g), decode_png_resample_16bit_value(b)) + end + end + end + + # Decodes a scanline of an 8-bit, grayscale image with transparency into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_grayscale_alpha_8bit(stream, pos, width) + (0...width).map { |i| ChunkyPNG::Color.grayscale_alpha(stream.getbyte(pos + (i * 2) + 1), stream.getbyte(pos + (i * 2) + 2)) } + end + + # Decodes a scanline of a 16-bit, grayscale image with transparency into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_grayscale_alpha_16bit(stream, pos, width) + [].tap do |pixels| + stream.unpack("@#{pos + 1}n#{width * 2}").each_slice(2) do |g, a| + pixels << ChunkyPNG::Color.grayscale_alpha(decode_png_resample_16bit_value(g), decode_png_resample_16bit_value(a)) + end + end + end + + # Decodes a scanline of a 1-bit, grayscale image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_grayscale_1bit(stream, pos, width) + (0...width).map do |index| + value = decode_png_extract_1bit_value(stream.getbyte(pos + 1 + (index >> 3)), index) + value == 1 ? ChunkyPNG::Color::WHITE : ChunkyPNG::Color::BLACK + end + end + + # Decodes a scanline of a 2-bit, grayscale image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_grayscale_2bit(stream, pos, width) + (0...width).map do |index| + value = decode_png_extract_2bit_value(stream.getbyte(pos + 1 + (index >> 2)), index) + ChunkyPNG::Color.grayscale(decode_png_resample_2bit_value(value)) + end + end + + # Decodes a scanline of a 4-bit, grayscale image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_grayscale_4bit(stream, pos, width) + (0...width).map do |index| + value = decode_png_extract_4bit_value(stream.getbyte(pos + 1 + (index >> 1)), index) + ChunkyPNG::Color.grayscale(decode_png_resample_4bit_value(value)) + end + end + + # Decodes a scanline of an 8-bit, grayscale image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_grayscale_8bit(stream, pos, width) + (1..width).map { |i| ChunkyPNG::Color.grayscale(stream.getbyte(pos + i)) } + end + + # Decodes a scanline of a 16-bit, grayscale image into a row of pixels. + # @params (see #decode_png_pixels_from_scanline_indexed_1bit) + # @return (see #decode_png_pixels_from_scanline_indexed_1bit) + def decode_png_pixels_from_scanline_grayscale_16bit(stream, pos, width) + values = stream.unpack("@#{pos + 1}n#{width}") + values.map { |value| ChunkyPNG::Color.grayscale(decode_png_resample_16bit_value(value)) } + end + + # Returns the method name to use to decode scanlines into pixels. + # @param [Integer] color_mode The color mode of the image. + # @param [Integer] depth The bit depth of the image. + # @return [Symbol] The method name to use for decoding, to be called on the canvas class. + # @raise [ChunkyPNG::NotSupported] when the color_mode and/or bit depth is not supported. + def decode_png_pixels_from_scanline_method(color_mode, depth) + decoder_method = case color_mode + when ChunkyPNG::COLOR_TRUECOLOR; :"decode_png_pixels_from_scanline_truecolor_#{depth}bit" + when ChunkyPNG::COLOR_TRUECOLOR_ALPHA; :"decode_png_pixels_from_scanline_truecolor_alpha_#{depth}bit" + when ChunkyPNG::COLOR_INDEXED; :"decode_png_pixels_from_scanline_indexed_#{depth}bit" + when ChunkyPNG::COLOR_GRAYSCALE; :"decode_png_pixels_from_scanline_grayscale_#{depth}bit" + when ChunkyPNG::COLOR_GRAYSCALE_ALPHA; :"decode_png_pixels_from_scanline_grayscale_alpha_#{depth}bit" + else nil + end + + raise ChunkyPNG::NotSupported, "No decoder found for color mode #{color_mode} and #{depth}-bit depth!" unless respond_to?(decoder_method) + decoder_method + end + + # Decodes a single PNG image pass width a given width, height and color + # mode, to a Canvas, starting at the given position in the stream. + # + # A non-interlaced image only consists of one pass, while an Adam7 + # image consists of 7 passes that must be combined after decoding. + # + # @param stream (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param width (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param height (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param color_mode (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + # @param [Integer] start_pos The position in the pixel stream to start reading. + # @return (see ChunkyPNG::Canvas::PNGDecoding#decode_png_pixelstream) + def decode_png_image_pass(stream, width, height, color_mode, depth, start_pos) + + pixels = [] + if width > 0 && height > 0 + + stream << ChunkyPNG::EXTRA_BYTE if color_mode == ChunkyPNG::COLOR_TRUECOLOR + pixel_decoder = decode_png_pixels_from_scanline_method(color_mode, depth) + line_length = ChunkyPNG::Color.scanline_bytesize(color_mode, depth, width) + pixel_size = ChunkyPNG::Color.pixel_bytesize(color_mode, depth) + + raise ChunkyPNG::ExpectationFailed, "Invalid stream length!" unless stream.bytesize - start_pos >= ChunkyPNG::Color.pass_bytesize(color_mode, depth, width, height) + + pos, prev_pos = start_pos, nil + for line_no in 0...height do + decode_png_str_scanline(stream, pos, prev_pos, line_length, pixel_size) + pixels += send(pixel_decoder, stream, pos, width) + + prev_pos = pos + pos += line_length + 1 + end + end + + new(width, height, pixels) + end + + # Decodes a scanline if it was encoded using filtering. + # + # It will extract the filtering method from the first byte of the scanline, and uses the + # method to change the subsequent bytes to unfiltered values. This will modify the pixelstream. + # + # The bytes of the scanline can then be used to construct pixels, based on the color mode.. + # + # @param [String] stream The pixelstream to undo the filtering in. + # @param [Integer] pos The starting position of the scanline to decode. + # @param [Integer, nil] prev_pos The starting position of the previously decoded scanline, or nil + # if this is the first scanline of the image. + # @param [Integer] line_length The number of bytes in the scanline, discounting the filter method byte. + # @param [Integer] pixel_size The number of bytes used per pixel, based on the color mode. + # @return [nil] + def decode_png_str_scanline(stream, pos, prev_pos, line_length, pixel_size) + case stream.getbyte(pos) + when ChunkyPNG::FILTER_NONE; # noop + when ChunkyPNG::FILTER_SUB; decode_png_str_scanline_sub( stream, pos, prev_pos, line_length, pixel_size) + when ChunkyPNG::FILTER_UP; decode_png_str_scanline_up( stream, pos, prev_pos, line_length, pixel_size) + when ChunkyPNG::FILTER_AVERAGE; decode_png_str_scanline_average( stream, pos, prev_pos, line_length, pixel_size) + when ChunkyPNG::FILTER_PAETH; decode_png_str_scanline_paeth( stream, pos, prev_pos, line_length, pixel_size) + else raise ChunkyPNG::NotSupported, "Unknown filter type: #{stream.getbyte(pos)}!" + end + end + + # Decodes a scanline that wasn't encoded using filtering. This is a no-op. + # @params (see #decode_png_str_scanline) + # @return [nil] + def decode_png_str_scanline_sub_none(stream, pos, prev_pos, line_length, pixel_size) + # noop - this method shouldn't get called. + end + + # Decodes a scanline in a pxielstream that was encoded using SUB filtering. + # This will chnage the pixelstream to have unfiltered values. + # @params (see #decode_png_str_scanline) + # @return [nil] + def decode_png_str_scanline_sub(stream, pos, prev_pos, line_length, pixel_size) + for i in 1..line_length do + stream.setbyte(pos + i, (stream.getbyte(pos + i) + (i > pixel_size ? stream.getbyte(pos + i - pixel_size) : 0)) & 0xff) + end + end + + # Decodes a scanline in a pxielstream that was encoded using UP filtering. + # This will chnage the pixelstream to have unfiltered values. + # @params (see #decode_png_str_scanline) + # @return [nil] + def decode_png_str_scanline_up(stream, pos, prev_pos, line_length, pixel_size) + for i in 1..line_length do + up = prev_pos ? stream.getbyte(prev_pos + i) : 0 + stream.setbyte(pos + i, (stream.getbyte(pos + i) + up) & 0xff) + end + end + + # Decodes a scanline in a pxielstream that was encoded using AVERAGE filtering. + # This will chnage the pixelstream to have unfiltered values. + # @params (see #decode_png_str_scanline) + # @return [nil] + def decode_png_str_scanline_average(stream, pos, prev_pos, line_length, pixel_size) + for i in 1..line_length do + a = (i > pixel_size) ? stream.getbyte(pos + i - pixel_size) : 0 + b = prev_pos ? stream.getbyte(prev_pos + i) : 0 + stream.setbyte(pos + i, (stream.getbyte(pos + i) + ((a + b) >> 1)) & 0xff) + end + end + + # Decodes a scanline in a pxielstream that was encoded using PAETH filtering. + # This will chnage the pixelstream to have unfiltered values. + # @params (see #decode_png_str_scanline) + # @return [nil] + def decode_png_str_scanline_paeth(stream, pos, prev_pos, line_length, pixel_size) + for i in 1..line_length do + cur_pos = pos + i + a = (i > pixel_size) ? stream.getbyte(cur_pos - pixel_size) : 0 + b = prev_pos ? stream.getbyte(prev_pos + i) : 0 + c = (prev_pos && i > pixel_size) ? stream.getbyte(prev_pos + i - pixel_size) : 0 + p = a + b - c + pa = (p - a).abs + pb = (p - b).abs + pc = (p - c).abs + pr = (pa <= pb) ? (pa <= pc ? a : c) : (pb <= pc ? b : c) + stream.setbyte(cur_pos, (stream.getbyte(cur_pos) + pr) & 0xff) + end + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/png_encoding.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/png_encoding.rb new file mode 100644 index 00000000..35f6853c --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/png_encoding.rb @@ -0,0 +1,292 @@ +module ChunkyPNG + class Canvas + + # Methods for encoding a Canvas instance into a PNG datastream. + # + # Overview of the encoding process: + # + # * The image is split up in scanlines (i.e. rows of pixels); + # * All pixels are encoded as a pixelstream, based on the color mode. + # * All the pixel bytes in the pixelstream are adjusted using a filtering + # method if one is specified. + # * Compress the resulting string using deflate compression. + # * Split compressed data over one or more PNG chunks. + # * These chunks should be embedded in a datastream with at least a IHDR and + # IEND chunk and possibly a PLTE chunk. + # + # For interlaced images, the initial image is first split into 7 subimages. + # These images get encoded exectly as above, and the result gets combined + # before the compression step. + # + # @see ChunkyPNG::Canvas::PNGDecoding + # @see http://www.w3.org/TR/PNG/ The W3C PNG format specification + module PNGEncoding + + # The palette used for encoding the image.This is only in used for images + # that get encoded using indexed colors. + # @return [ChunkyPNG::Palette] + attr_accessor :encoding_palette + + # Writes the canvas to an IO stream, encoded as a PNG image. + # @param [IO] io The output stream to write to. + # @param constraints (see ChunkyPNG::Canvas::PNGEncoding#to_datastream) + def write(io, constraints = {}) + to_datastream(constraints).write(io) + end + + # Writes the canvas to a file, encoded as a PNG image. + # @param [String] filname The file to save the PNG image to. + # @param constraints (see ChunkyPNG::Canvas::PNGEncoding#to_datastream) + def save(filename, constraints = {}) + File.open(filename, 'wb') { |io| write(io, constraints) } + end + + # Encoded the canvas to a PNG formatted string. + # @param constraints (see ChunkyPNG::Canvas::PNGEncoding#to_datastream) + # @return [String] The PNG encoded canvas as string. + def to_blob(constraints = {}) + to_datastream(constraints).to_blob + end + + alias_method :to_string, :to_blob + alias_method :to_s, :to_blob + + # Converts this Canvas to a datastream, so that it can be saved as a PNG image. + # @param [Hash, Symbol] constraints The constraints to use when encoding the canvas. + # This can either be a hash with different constraints, or a symbol which acts as a + # preset for some constraints. If no constraints are given, ChunkyPNG will decide + # for itself how to best create the PNG datastream. + # Supported presets are :fast_rgba for quickly saving images with transparency, + # :fast_rgb for quickly saving opaque images, and :best_compression to + # obtain the smallest possible filesize. + # @option constraints [Fixnum] :color_mode The color mode to use. Use one of the + # ChunkyPNG::COLOR_* constants. + # @option constraints [true, false] :interlace Whether to use interlacing. + # @option constraints [Fixnum] :compression The compression level for Zlib. This can be a + # value between 0 and 9, or a Zlib constant like Zlib::BEST_COMPRESSION. + # @return [ChunkyPNG::Datastream] The PNG datastream containing the encoded canvas. + # @see ChunkyPNG::Canvas::PNGEncoding#determine_png_encoding + def to_datastream(constraints = {}) + encoding = determine_png_encoding(constraints) + + ds = Datastream.new + ds.header_chunk = Chunk::Header.new(:width => width, :height => height, + :color => encoding[:color_mode], :interlace => encoding[:interlace]) + + if encoding[:color_mode] == ChunkyPNG::COLOR_INDEXED + ds.palette_chunk = encoding_palette.to_plte_chunk + ds.transparency_chunk = encoding_palette.to_trns_chunk unless encoding_palette.opaque? + end + data = encode_png_pixelstream(encoding[:color_mode], encoding[:interlace], encoding[:filtering]) + ds.data_chunks = Chunk::ImageData.split_in_chunks(data, encoding[:compression]) + ds.end_chunk = Chunk::End.new + return ds + end + + protected + + # Determines the best possible PNG encoding variables for this image, by analyzing + # the colors used for the image. + # + # You can provide constraints for the encoding variables by passing a hash with + # encoding variables to this method. + # + # @param [Hash, Symbol] constraints The constraints for the encoding. This can be a + # Hash or a preset symbol. + # @return [Hash] A hash with encoding options for {ChunkyPNG::Canvas::PNGEncoding#to_datastream} + def determine_png_encoding(constraints = {}) + + if constraints == :fast_rgb + encoding = { :color_mode => ChunkyPNG::COLOR_TRUECOLOR, :compression => Zlib::BEST_SPEED } + elsif constraints == :fast_rgba + encoding = { :color_mode => ChunkyPNG::COLOR_TRUECOLOR_ALPHA, :compression => Zlib::BEST_SPEED } + elsif constraints == :best_compression + encoding = { :compression => Zlib::BEST_COMPRESSION, :filtering => ChunkyPNG::FILTER_PAETH } + elsif constraints == :good_compression + encoding = { :compression => Zlib::BEST_COMPRESSION, :filtering => ChunkyPNG::FILTER_NONE } + elsif constraints == :no_compression + encoding = { :compression => Zlib::NO_COMPRESSION } + else + encoding = constraints + end + + # Do not create a pallete when the encoding is given and does not require a palette. + if encoding[:color_mode] + if encoding[:color_mode] == ChunkyPNG::COLOR_INDEXED + self.encoding_palette = self.palette + end + else + self.encoding_palette = self.palette + encoding[:color_mode] ||= encoding_palette.best_colormode + end + + # Use Zlib's default for compression unless otherwise provided. + encoding[:compression] ||= Zlib::DEFAULT_COMPRESSION + + encoding[:interlace] = case encoding[:interlace] + when nil, false, ChunkyPNG::INTERLACING_NONE; ChunkyPNG::INTERLACING_NONE + when true, ChunkyPNG::INTERLACING_ADAM7; ChunkyPNG::INTERLACING_ADAM7 + else encoding[:interlace] + end + + encoding[:filtering] ||= case encoding[:compression] + when Zlib::BEST_COMPRESSION; ChunkyPNG::FILTER_PAETH + when Zlib::NO_COMPRESSION..Zlib::BEST_SPEED; ChunkyPNG::FILTER_NONE + else ChunkyPNG::FILTER_UP + end + return encoding + end + + # Encodes the canvas according to the PNG format specification with a given color + # mode, possibly with interlacing. + # @param [Integer] color_mode The color mode to use for encoding. + # @param [Integer] interlace The interlacing method to use. + # @return [String] The PNG encoded canvas as string. + def encode_png_pixelstream(color_mode = ChunkyPNG::COLOR_TRUECOLOR, interlace = ChunkyPNG::INTERLACING_NONE, filtering = ChunkyPNG::FILTER_NONE) + + if color_mode == ChunkyPNG::COLOR_INDEXED && (encoding_palette.nil? || !encoding_palette.can_encode?) + raise ChunkyPNG::ExpectationFailed, "This palette is not suitable for encoding!" + end + + case interlace + when ChunkyPNG::INTERLACING_NONE; encode_png_image_without_interlacing(color_mode, filtering) + when ChunkyPNG::INTERLACING_ADAM7; encode_png_image_with_interlacing(color_mode, filtering) + else raise ChunkyPNG::NotSupported, "Unknown interlacing method: #{interlace}!" + end + end + + # Encodes the canvas according to the PNG format specification with a given color mode. + # @param [Integer] color_mode The color mode to use for encoding. + # @param [Integer] filtering The filtering method to use. + # @return [String] The PNG encoded canvas as string. + def encode_png_image_without_interlacing(color_mode, filtering = ChunkyPNG::FILTER_NONE) + stream = ChunkyPNG::Datastream.empty_bytearray + encode_png_image_pass_to_stream(stream, color_mode, filtering) + stream + end + + # Encodes the canvas according to the PNG format specification with a given color + # mode and Adam7 interlacing. + # + # This method will split the original canva in 7 smaller canvases and encode them + # one by one, concatenating the resulting strings. + # + # @param [Integer] color_mode The color mode to use for encoding. + # @param [Integer] filtering The filtering method to use. + # @return [String] The PNG encoded canvas as string. + def encode_png_image_with_interlacing(color_mode, filtering = ChunkyPNG::FILTER_NONE) + stream = ChunkyPNG::Datastream.empty_bytearray + 0.upto(6) do |pass| + subcanvas = self.class.adam7_extract_pass(pass, self) + subcanvas.encoding_palette = encoding_palette + subcanvas.encode_png_image_pass_to_stream(stream, color_mode, filtering) + end + stream + end + + # Encodes the canvas to a stream, in a given color mode. + # @param [String] stream The stream to write to. + # @param [Integer] color_mode The color mode to use for encoding. + # @param [Integer] filtering The filtering method to use. + def encode_png_image_pass_to_stream(stream, color_mode, filtering) + + start_pos = stream.bytesize + pixel_size = Color.pixel_bytesize(color_mode) + line_width = pixel_size * width + + # Encode the whole image without filtering + stream << case color_mode + when ChunkyPNG::COLOR_TRUECOLOR; pixels.pack(('x' + ('NX' * width)) * height) + when ChunkyPNG::COLOR_TRUECOLOR_ALPHA; pixels.pack("xN#{width}" * height) + when ChunkyPNG::COLOR_INDEXED; pixels.map { |p| encoding_palette.index(p) }.pack("xC#{width}" * height) + when ChunkyPNG::COLOR_GRAYSCALE; pixels.map { |p| p >> 8 }.pack("xC#{width}" * height) + when ChunkyPNG::COLOR_GRAYSCALE_ALPHA; pixels.pack("xn#{width}" * height) + else raise ChunkyPNG::NotSupported, "Cannot encode pixels for this mode: #{color_mode}!" + end + + # Determine the filter method + filter_method = case filtering + when ChunkyPNG::FILTER_SUB; :encode_png_str_scanline_sub + when ChunkyPNG::FILTER_UP; :encode_png_str_scanline_up + when ChunkyPNG::FILTER_AVERAGE; :encode_png_str_scanline_average + when ChunkyPNG::FILTER_PAETH; :encode_png_str_scanline_paeth + else nil + end + + # Now, apply filtering if any + if filter_method + (height - 1).downto(0) do |y| + pos = start_pos + y * (line_width + 1) + prev_pos = (y == 0) ? nil : pos - (line_width + 1) + send(filter_method, stream, pos, prev_pos, line_width, pixel_size) + end + end + end + + # Encodes a scanline of a pixelstream without filtering. This is a no-op. + # @param [String] stream The pixelstream to work on. This string will be modified. + # @param [Integer] pos The starting position of the scanline. + # @param [Integer, nil] prev_pos The starting position of the previous scanline. nil if + # this is the first line. + # @param [Integer] line_width The number of bytes in this scanline, without counting the filtering + # method byte. + # @param [Integer] pixel_size The number of bytes used per pixel. + # @return [nil] + def encode_png_str_scanline_none(stream, pos, prev_pos, line_width, pixel_size) + # noop - this method shouldn't get called at all. + end + + # Encodes a scanline of a pixelstream using SUB filtering. This will modify the stream. + # @param (see #encode_png_str_scanline_none) + # @return [nil] + def encode_png_str_scanline_sub(stream, pos, prev_pos, line_width, pixel_size) + line_width.downto(1) do |i| + a = (i > pixel_size) ? stream.getbyte(pos + i - pixel_size) : 0 + stream.setbyte(pos + i, (stream.getbyte(pos + i) - a) & 0xff) + end + stream.setbyte(pos, ChunkyPNG::FILTER_SUB) + end + + # Encodes a scanline of a pixelstream using UP filtering. This will modify the stream. + # @param (see #encode_png_str_scanline_none) + # @return [nil] + def encode_png_str_scanline_up(stream, pos, prev_pos, line_width, pixel_size) + line_width.downto(1) do |i| + b = prev_pos ? stream.getbyte(prev_pos + i) : 0 + stream.setbyte(pos + i, (stream.getbyte(pos + i) - b) & 0xff) + end + stream.setbyte(pos, ChunkyPNG::FILTER_UP) + end + + # Encodes a scanline of a pixelstream using AVERAGE filtering. This will modify the stream. + # @param (see #encode_png_str_scanline_none) + # @return [nil] + def encode_png_str_scanline_average(stream, pos, prev_pos, line_width, pixel_size) + line_width.downto(1) do |i| + a = (i > pixel_size) ? stream.getbyte(pos + i - pixel_size) : 0 + b = prev_pos ? stream.getbyte(prev_pos + i) : 0 + stream.setbyte(pos + i, (stream.getbyte(pos + i) - ((a + b) >> 1)) & 0xff) + end + stream.setbyte(pos, ChunkyPNG::FILTER_AVERAGE) + end + + # Encodes a scanline of a pixelstream using PAETH filtering. This will modify the stream. + # @param (see #encode_png_str_scanline_none) + # @return [nil] + def encode_png_str_scanline_paeth(stream, pos, prev_pos, line_width, pixel_size) + line_width.downto(1) do |i| + a = (i > pixel_size) ? stream.getbyte(pos + i - pixel_size) : 0 + b = (prev_pos) ? stream.getbyte(prev_pos + i) : 0 + c = (prev_pos && i > pixel_size) ? stream.getbyte(prev_pos + i - pixel_size) : 0 + p = a + b - c + pa = (p - a).abs + pb = (p - b).abs + pc = (p - c).abs + pr = (pa <= pb && pa <= pc) ? a : (pb <= pc ? b : c) + stream.setbyte(pos + i, (stream.getbyte(pos + i) - pr) & 0xff) + end + stream.setbyte(pos, ChunkyPNG::FILTER_PAETH) + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/stream_exporting.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/stream_exporting.rb new file mode 100644 index 00000000..d3e4dca7 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/stream_exporting.rb @@ -0,0 +1,41 @@ +module ChunkyPNG + class Canvas + + # Methods to save load a canvas from to stream, encoded in RGB, RGBA, BGR or ABGR format. + module StreamExporting + + # Creates an RGB-formatted pixelstream with the pixel data from this canvas. + # + # Note that this format is fast but bloated, because no compression is used + # and the internal representation is left intact. To reconstruct the + # canvas, the width and height should be known. + # + # @return [String] The RGBA-formatted pixel data. + def to_rgba_stream + pixels.pack('N*') + end + + # Creates an RGB-formatted pixelstream with the pixel data from this canvas. + # + # Note that this format is fast but bloated, because no compression is used + # and the internal representation is almost left intact. To reconstruct + # the canvas, the width and height should be known. + # + # @return [String] The RGB-formatted pixel data. + def to_rgb_stream + pixels.pack('NX' * (width * height)) + end + + # Creates an ABGR-formatted pixelstream with the pixel data from this canvas. + # + # Note that this format is fast but bloated, because no compression is used + # and the internal representation is left intact. To reconstruct the + # canvas, the width and height should be known. + # + # @return [String] The RGBA-formatted pixel data. + def to_abgr_stream + pixels.pack('V*') + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/stream_importing.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/stream_importing.rb new file mode 100644 index 00000000..c6030629 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/canvas/stream_importing.rb @@ -0,0 +1,77 @@ +module ChunkyPNG + class Canvas + + # Methods to quikcly load a canvas from a stream, encoded in RGB, RGBA, BGR or ABGR format. + module StreamImporting + + # Creates a canvas by reading pixels from an RGB formatted stream with a + # provided with and height. + # + # Every pixel should be represented by 3 bytes in the stream, in the correct + # RGB order. This format closely resembles the internal representation of a + # canvas object, so this kind of stream can be read extremely quickly. + # + # @param [Integer] width The width of the new canvas. + # @param [Integer] height The height of the new canvas. + # @param [#read, String] stream The stream to read the pixel data from. + # @return [ChunkyPNG::Canvas] The newly constructed canvas instance. + def from_rgb_stream(width, height, stream) + string = stream.respond_to?(:read) ? stream.read(3 * width * height) : stream.to_s[0, 3 * width * height] + string << ChunkyPNG::EXTRA_BYTE # Add a fourth byte to the last RGB triple. + unpacker = 'NX' * (width * height) + pixels = string.unpack(unpacker).map { |color| color | 0x000000ff } + self.new(width, height, pixels) + end + + # Creates a canvas by reading pixels from an RGBA formatted stream with a + # provided with and height. + # + # Every pixel should be represented by 4 bytes in the stream, in the correct + # RGBA order. This format is exactly like the internal representation of a + # canvas object, so this kind of stream can be read extremely quickly. + # + # @param [Integer] width The width of the new canvas. + # @param [Integer] height The height of the new canvas. + # @param [#read, String] stream The stream to read the pixel data from. + # @return [ChunkyPNG::Canvas] The newly constructed canvas instance. + def from_rgba_stream(width, height, stream) + string = stream.respond_to?(:read) ? stream.read(4 * width * height) : stream.to_s[0, 4 * width * height] + self.new(width, height, string.unpack("N*")) + end + + # Creates a canvas by reading pixels from an BGR formatted stream with a + # provided with and height. + # + # Every pixel should be represented by 3 bytes in the stream, in the correct + # BGR order. This format closely resembles the internal representation of a + # canvas object, so this kind of stream can be read extremely quickly. + # + # @param [Integer] width The width of the new canvas. + # @param [Integer] height The height of the new canvas. + # @param [#read, String] stream The stream to read the pixel data from. + # @return [ChunkyPNG::Canvas] The newly constructed canvas instance. + def from_bgr_stream(width, height, stream) + string = ChunkyPNG::EXTRA_BYTE # Add a first byte to the first BGR triple. + string << stream.respond_to?(:read) ? stream.read(3 * width * height) : stream.to_s[0, 3 * width * height] + pixels = string.unpack("@1" << ('XV' * (width * height))).map { |color| color | 0x000000ff } + self.new(width, height, pixels) + end + + # Creates a canvas by reading pixels from an ARGB formatted stream with a + # provided with and height. + # + # Every pixel should be represented by 4 bytes in the stream, in the correct + # ARGB order. This format is almost like the internal representation of a + # canvas object, so this kind of stream can be read extremely quickly. + # + # @param [Integer] width The width of the new canvas. + # @param [Integer] height The height of the new canvas. + # @param [#read, String] stream The stream to read the pixel data from. + # @return [ChunkyPNG::Canvas] The newly constructed canvas instance. + def from_abgr_stream(width, height, stream) + string = stream.respond_to?(:read) ? stream.read(4 * width * height) : stream.to_s[0, 4 * width * height] + self.new(width, height, string.unpack("V*")) + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/chunk.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/chunk.rb new file mode 100644 index 00000000..0a85cfb7 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/chunk.rb @@ -0,0 +1,294 @@ +module ChunkyPNG + + # A PNG datastream consists of multiple chunks. This module, and the classes + # contained within, help with handling these chunks. It supports both + # reading and writing chunks. + # + # All chunck types are instances of the {ChunkyPNG::Chunk::Base} class. For + # some chunk types a specialized class is available, e.g. the IHDR chunk is + # represented by the {ChunkyPNG::Chunk::Header} class. These specialized + # classes help accessing the content of the chunk. All other chunks are + # represented by the {ChunkyPNG::Chunk::Generic} class. + # + # @see ChunkyPNG::Datastream + module Chunk + + # Reads a chunk from an IO stream. + # + # @param [IO, #read] io The IO stream to read from. + # @return [ChunkyPNG::Chung::Base] The loaded chunk instance. + def self.read(io) + + length, type = io.read(8).unpack('Na4') + content = io.read(length) + crc = io.read(4).unpack('N').first + + verify_crc!(type, content, crc) + + CHUNK_TYPES.fetch(type, Generic).read(type, content) + end + + # Verifies the CRC of a chunk. + # @param [String] type The chunk's type. + # @param [String] content The chunk's content. + # @param [Integer] content The chunk's content. + # @raise [RuntimeError] An exception is raised if the found CRC value + # is not equal to the expected CRC value. + def self.verify_crc!(type, content, found_crc) + expected_crc = Zlib.crc32(content, Zlib.crc32(type)) + raise ChunkyPNG::CRCMismatch, "Chuck CRC mismatch!" if found_crc != expected_crc + end + + # The base chunk class is the superclass for every chunk type. It contains + # methods to write the chunk to an output stream. + # + # A subclass should implement the +content+ method, which gets called when + # the chunk gets written to a PNG datastream + # + # @abstract + class Base + + # The four-character type indicator for the chunk. This field is used to + # find the correct class for a chunk when it is loaded from a PNG stream. + # @return [String] + attr_accessor :type + + # Initializes the chunk instance. + # @param [String] type The four character chunk type indicator. + # @param [Hash] attributes A hash of attributes to set on this chunk. + def initialize(type, attributes = {}) + self.type = type + attributes.each { |k, v| send("#{k}=", v) } + end + + # Writes the chunk to the IO stream, using the provided content. + # The checksum will be calculated and appended to the stream. + # @param [IO] io The IO stream to write to. + # @param [String] content The content for this chunk. + def write_with_crc(io, content) + io << [content.length].pack('N') << type << content + io << [Zlib.crc32(content, Zlib.crc32(type))].pack('N') + end + + # Writes the chunk to the IO stream. + # + # It will call te +content+ method to get the content for this chunk, + # and will calculate and append the checksum automatically. + # @param [IO] io The IO stream to write to. + def write(io) + write_with_crc(io, content || '') + end + end + + # The Generic chunk type will read the content from the chunk as it, + # and will write it back as it was read. + class Generic < Base + + # The attribute to store the content from the chunk, which gets + # written by the +write+ method. + attr_accessor :content + + + def initialize(type, content = '') + super(type, :content => content) + end + + # Creates an instance, given the chunk's type and content. + # @param [String] type The four character chunk type indicator. + # @param [String] content The content read from the chunk. + # @return [ChunkyPNG::Chunk::Generic] The new chunk instance. + def self.read(type, content) + self.new(type, content) + end + end + + # The header (IHDR) chunk is the first chunk of every PNG image, and + # contains information about the image: i.e. its width, height, color + # depth, color mode, compression method, filtering method and interlace + # method. + # + # ChunkyPNG supports all values for these variables that are defined in + # the PNG spec, except for color depth: Only 8-bit depth images are + # supported. Note that it is still possible to access the chunk for such + # an image, but ChunkyPNG will raise an exception if you try to access + # the pixel data. + class Header < Base + + attr_accessor :width, :height, :depth, :color, :compression, :filtering, :interlace + + def initialize(attrs = {}) + super('IHDR', attrs) + @depth ||= 8 + @color ||= ChunkyPNG::COLOR_TRUECOLOR + @compression ||= ChunkyPNG::COMPRESSION_DEFAULT + @filtering ||= ChunkyPNG::FILTERING_DEFAULT + @interlace ||= ChunkyPNG::INTERLACING_NONE + end + + # Reads the 13 bytes of content from the header chunk to set the image attributes. + # @param [String] type The four character chunk type indicator (= "IHDR"). + # @param [String] content The 13 bytes of content read from the chunk. + # @return [ChunkyPNG::Chunk::End] The new Header chunk instance with the + # variables set to the values according to the content. + def self.read(type, content) + fields = content.unpack('NNC5') + self.new(:width => fields[0], :height => fields[1], :depth => fields[2], :color => fields[3], + :compression => fields[4], :filtering => fields[5], :interlace => fields[6]) + end + + # Returns the content for this chunk when it gets written to a file, by packing the + # image information variables into the correct format. + # @return [String] The 13-byte content for the header chunk. + def content + [width, height, depth, color, compression, filtering, interlace].pack('NNC5') + end + end + + # The End (IEND) chunk indicates the last chunk of a PNG stream. It does not + # contain any data. + class End < Base + + def initialize + super('IEND') + end + + # Reads the END chunk. It will check if the content is empty. + # @param [String] type The four character chunk type indicator (= "IEND"). + # @param [String] content The content read from the chunk. Should be empty. + # @return [ChunkyPNG::Chunk::End] The new End chunk instance. + # @raise [RuntimeError] Raises an exception if the content was not empty. + def self.read(type, content) + raise ExpectationFailed, 'The IEND chunk should be empty!' if content.bytesize > 0 + self.new + end + + # Returns an empty string, because this chunk should always be empty. + # @return [""] An empty string. + def content + ChunkyPNG::Datastream.empty_bytearray + end + end + + # The Palette (PLTE) chunk contains the image's palette, i.e. the + # 8-bit RGB colors this image is using. + # + # @see ChunkyPNG::Chunk::Transparency + # @see ChunkyPNG::Palette + class Palette < Generic + end + + # A transparency (tRNS) chunk contains the alpha channel for the colors + # defined in the Palette (PLTE) chunk + # + # @see ChunkyPNG::Chunk::Palette + # @see ChunkyPNG::Palette + class Transparency < Generic + end + + class ImageData < Generic + + def self.read(type, content) + raise ExpectationFailed, 'The IDAT chunk should not be empty!' if content.bytesize == 0 + super + end + + def self.combine_chunks(data_chunks) + Zlib::Inflate.inflate(data_chunks.map { |c| c.content }.join('')) + end + + def self.split_in_chunks(data, level = Zlib::DEFAULT_COMPRESSION, chunk_size = 2147483647) + streamdata = Zlib::Deflate.deflate(data, level) + # TODO: Split long streamdata over multiple chunks + [ ChunkyPNG::Chunk::ImageData.new('IDAT', streamdata) ] + end + end + + # The Text (tEXt) chunk contains keyword/value metadata about the PNG stream. + # In this chunk, the value is stored uncompressed. + # + # The tEXt chunk only supports Latin-1 encoded textual data. If you need UTF-8 + # support, check out the InternationalText chunk type. + # + # @see ChunkyPNG::Chunk::CompressedText + # @see ChunkyPNG::Chunk::InternationalText + class Text < Base + + attr_accessor :keyword, :value + + def initialize(keyword, value) + super('tEXt') + @keyword, @value = keyword, value + end + + def self.read(type, content) + keyword, value = content.unpack('Z*a*') + new(keyword, value) + end + + # Creates the content to write to the stream, by concatenating the keyword + # with the value, joined by a null character. + # + # @return The content that should be written to the datastream. + def content + [keyword, value].pack('Z*a*') + end + end + + # The CompressedText (zTXt) chunk contains keyword/value metadata about + # the PNG stream. In this chunk, the value is compressed using Deflate + # compression. + # + # @see ChunkyPNG::Chunk::CompressedText + # @see ChunkyPNG::Chunk::InternationalText + class CompressedText < Base + + attr_accessor :keyword, :value + + def initialize(keyword, value) + super('zTXt') + @keyword, @value = keyword, value + end + + def self.read(type, content) + keyword, compression, value = content.unpack('Z*Ca*') + raise ChunkyPNG::NotSupported, "Compression method #{compression.inspect} not supported!" unless compression == ChunkyPNG::COMPRESSION_DEFAULT + new(keyword, Zlib::Inflate.inflate(value)) + end + + # Creates the content to write to the stream, by concatenating the keyword + # with the deflated value, joined by a null character. + # + # @return The content that should be written to the datastream. + def content + [keyword, ChunkyPNG::COMPRESSION_DEFAULT, Zlib::Deflate.deflate(value)].pack('Z*Ca*') + end + end + + # The Text (iTXt) chunk contains keyword/value metadata about the PNG stream. + # The metadata in this chunk can be encoded using UTF-8 characters. Moreover, + # it is possible to define the language of the metadata, and give a translation + # of the keyword name. Finally, it supports bot compressed and uncompressed + # values. + # + # @todo This chunk is currently not implemented, but merely read and written + # back intact. + # + # @see ChunkyPNG::Chunk::Text + # @see ChunkyPNG::Chunk::CompressedText + class InternationalText < Generic + + # TODO + end + + # Maps chunk types to classes, based on the four byte chunk type indicator at the + # beginning of a chunk. + # + # If a chunk type is not specified in this hash, the Generic chunk type will be used. + # + # @see ChunkyPNG::Chunk.read + CHUNK_TYPES = { + 'IHDR' => Header, 'IEND' => End, 'IDAT' => ImageData, 'PLTE' => Palette, 'tRNS' => Transparency, + 'tEXt' => Text, 'zTXt' => CompressedText, 'iTXt' => InternationalText + } + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/color.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/color.rb new file mode 100644 index 00000000..7e0d6990 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/color.rb @@ -0,0 +1,439 @@ +module ChunkyPNG + + # The Color module defines methods for handling colors. Within the ChunkyPNG + # library, the concepts of pixels and colors are both used, and they are + # both represented by a Integer. + # + # Pixels/colors are represented in RGBA componetns. Each of the four + # components is stored with a depth of 8 bits (maximum value = 255 = + # {ChunkyPNG::Color::MAX}). Together, these components are stored in a 4-byte + # Integer. + # + # A color will always be represented using these 4 components in memory. + # When the image is encoded, a more suitable representation can be used + # (e.g. rgb, grayscale, palette-based), for which several conversion methods + # are provided in this module. + module Color + extend self + + # The maximum value of each color component. + MAX = 0xff + + #################################################################### + # CONSTRUCTING COLOR VALUES + #################################################################### + + # Creates a new color using an r, g, b triple and an alpha value. + # @return [Integer] The newly constructed color value. + def rgba(r, g, b, a) + r << 24 | g << 16 | b << 8 | a + end + + # Creates a new color using an r, g, b triple. + # @return [Integer] The newly constructed color value. + def rgb(r, g, b) + r << 24 | g << 16 | b << 8 | 0xff + end + + # Creates a new color using a grayscale teint. + # @return [ChunkyPNG::Color] The newly constructed color value. + def grayscale(teint) + teint << 24 | teint << 16 | teint << 8 | 0xff + end + + # Creates a new color using a grayscale teint and alpha value. + # @return [Integer] The newly constructed color value. + def grayscale_alpha(teint, a) + teint << 24 | teint << 16 | teint << 8 | a + end + + #################################################################### + # COLOR IMPORTING + #################################################################### + + # Creates a color by unpacking an rgb triple from a string. + # + # @param [String] stream The string to load the color from. It should be + # at least 3 + pos bytes long. + # @param [Integer] pos The position in the string to load the triple from. + # @return [Integer] The newly constructed color value. + def from_rgb_stream(stream, pos = 0) + rgb(*stream.unpack("@#{pos}C3")) + end + + # Creates a color by unpacking an rgba triple from a string + # + # @param [String] stream The string to load the color from. It should be + # at least 4 + pos bytes long. + # @param [Integer] pos The position in the string to load the triple from. + # @return [Integer] The newly constructed color value. + def from_rgba_stream(stream, pos = 0) + rgba(*stream.unpack("@#{pos}C4")) + end + + # Creates a color by converting it from a string in hex notation. + # + # It supports colors with (#rrggbbaa) or without (#rrggbb) alpha channel. + # Color strings may include the prefix "0x" or "#". + # + # @param [String] str The color in hex notation. @return [Integer] The + # converted color value. + def from_hex(str) + case str + when /^(?:#|0x)?([0-9a-f]{6})$/i; ($1.hex << 8) | 0xff + when /^(?:#|0x)?([0-9a-f]{8})$/i; $1.hex + else raise ChunkyPNG::ExpectationFailed, "Not a valid hex color notation: #{str.inspect}!" + end + end + + #################################################################### + # PROPERTIES + #################################################################### + + # Returns the red-component from the color value. + # + # @param [Integer] value The color value. + # @return [Integer] A value between 0 and MAX. + def r(value) + (value & 0xff000000) >> 24 + end + + # Returns the green-component from the color value. + # + # @param [Integer] value The color value. + # @return [Integer] A value between 0 and MAX. + def g(value) + (value & 0x00ff0000) >> 16 + end + + # Returns the blue-component from the color value. + # + # @param [Integer] value The color value. + # @return [Integer] A value between 0 and MAX. + def b(value) + (value & 0x0000ff00) >> 8 + end + + # Returns the alpha channel value for the color value. + # + # @param [Integer] value The color value. + # @return [Integer] A value between 0 and MAX. + def a(value) + value & 0x000000ff + end + + # Returns true if this color is fully opaque. + # + # @param [Integer] value The color to test. + # @return [true, false] True if the alpha channel equals MAX. + def opaque?(value) + a(value) == 0x000000ff + end + + # Returns the opaque value of this color by removing the alpha channel. + # @param [Integer] value The color to transform. + # @return [Integer] The opauq color + def opaque!(value) + value | 0x000000ff + end + + # Returns true if this color is fully transparent. + # + # @param [Integer] value The color to test. + # @return [true, false] True if the r, g and b component are equal. + def grayscale?(value) + r(value) == b(value) && b(value) == g(value) + end + + # Returns true if this color is fully transparent. + # + # @param [Integer] value The color to test. + # @return [true, false] True if the alpha channel equals 0. + def fully_transparent?(value) + a(value) == 0x00000000 + end + + #################################################################### + # ALPHA COMPOSITION + #################################################################### + + # Multiplies two fractions using integer math, where the fractions are stored using an + # integer between 0 and 255. This method is used as a helper method for compositing + # colors using integer math. + # + # This is a quicker implementation of ((a * b) / 255.0).round. + # + # @param [Integer] a The first fraction. + # @param [Integer] b The second fraction. + # @return [Integer] The result of the multiplication. + def int8_mult(a, b) + t = a * b + 0x80 + ((t >> 8) + t) >> 8 + end + + # Composes two colors with an alpha channel using integer math. + # + # This version is faster than the version based on floating point math, so this + # compositing function is used by default. + # + # @param [Integer] fg The foreground color. + # @param [Integer] bg The foreground color. + # @return [Integer] The composited color. + # @see ChunkyPNG::Color#compose_precise + def compose_quick(fg, bg) + return fg if opaque?(fg) || fully_transparent?(bg) + return bg if fully_transparent?(fg) + + a_com = int8_mult(0xff - a(fg), a(bg)) + new_r = int8_mult(a(fg), r(fg)) + int8_mult(a_com, r(bg)) + new_g = int8_mult(a(fg), g(fg)) + int8_mult(a_com, g(bg)) + new_b = int8_mult(a(fg), b(fg)) + int8_mult(a_com, b(bg)) + new_a = a(fg) + a_com + rgba(new_r, new_g, new_b, new_a) + end + + # Composes two colors with an alpha channel using floating point math. + # + # This method uses more precise floating point math, but this precision is lost + # when the result is converted back to an integer. Because it is slower than + # the version based on integer math, that version is preferred. + # + # @param [Integer] fg The foreground color. + # @param [Integer] bg The foreground color. + # @return [Integer] The composited color. + # @see ChunkyPNG::Color#compose_quick + def compose_precise(fg, bg) + return fg if opaque?(fg) || fully_transparent?(bg) + return bg if fully_transparent?(fg) + + fg_a = a(fg).to_f / MAX + bg_a = a(bg).to_f / MAX + a_com = (1.0 - fg_a) * bg_a + + new_r = (fg_a * r(fg) + a_com * r(bg)).round + new_g = (fg_a * g(fg) + a_com * g(bg)).round + new_b = (fg_a * b(fg) + a_com * b(bg)).round + new_a = ((fg_a + a_com) * MAX).round + rgba(new_r, new_g, new_b, new_a) + end + + alias :compose :compose_quick + + # Blends the foreground and background color by taking the average of + # the components. + # + # @param [Integer] fg The foreground color. + # @param [Integer] bg The foreground color. + # @return [Integer] The blended color. + def blend(fg, bg) + (fg + bg) >> 1 + end + + # Lowers the intensity of a color, by lowering its alpha by a given factor. + # @param [Integer] color The color to adjust. + # @param [Integer] factor Fade factor as an integer between 0 and 255. + # @return [Integer] The faded color. + def fade(color, factor) + new_alpha = int8_mult(a(color), factor) + (color & 0xffffff00) | new_alpha + end + + # Decomposes a color, given a color, a mask color and a background color. + # The returned color will be a variant of the mask color, with the alpha + # channel set to the best fitting value. This basically is the reverse + # operation if alpha composition. + # + # If the color cannot be decomposed, this method will return the fully + # transparentvariant of the mask color. + # + # @param [Integer] color The color that was the result of compositing. + # @param [Integer] mask The opaque variant of the color that was being composed + # @param [Integer] bg The background color on which the color was composed. + # @param [Integer] tolerance The decomposition tolerance level, a value between 0 and 255. + # @return [Integer] The decomposed color,a variant of the masked color with the + # alpha channel set to an appropriate value. + def decompose_color(color, mask, bg, tolerance = 1) + if alpha_decomposable?(color, mask, bg, tolerance) + mask & 0xffffff00 | decompose_alpha(color, mask, bg) + else + mask & 0xffffff00 + end + end + + # Checks whether an alpha channel value can successfully be composed + # given the resulting color, the mask color and a background color, + # all of which should be opaque. + # + # @param [Integer] color The color that was the result of compositing. + # @param [Integer] mask The opauqe variant of the color that was being composed + # @param [Integer] bg The background color on which the color was composed. + # @param [Integer] tolerance The decomposition tolerance level, a value between 0 and 255. + # @return [Integer] The decomposed alpha channel value, between 0 and 255. + # @see #decompose_alpha + def alpha_decomposable?(color, mask, bg, tolerance = 1) + components = decompose_alpha_components(color, mask, bg) + sum = components.inject(0) { |a,b| a + b } + max = components.max * 3 + return components.max <= 255 && components.min >= 0 && (sum + tolerance * 3) >= max + end + + # Decomposes the alpha channel value given the resulting color, the mask color + # and a background color, all of which should be opaque. + # + # Make sure to call {#alpha_decomposable?} first to see if the alpha channel + # value can successfully decomposed with a given tolerance, otherwise the return + # value of this method is undefined. + # + # @param [Integer] color The color that was the result of compositing. + # @param [Integer] mask The opauqe variant of the color that was being composed + # @param [Integer] bg The background color on which the color was composed. + # @return [Integer] The best fitting alpha channel, a value between 0 and 255. + # @see #alpha_decomposable? + def decompose_alpha(color, mask, bg) + components = decompose_alpha_components(color, mask, bg) + (components.inject(0) { |a,b| a + b } / 3.0).round + end + + # Decomposes an alpha channel for either the r, g or b color channel. + # @param [:r, :g, :b] The channel to decompose the alpha channel from. + # @param [Integer] color The color that was the result of compositing. + # @param [Integer] mask The opauqe variant of the color that was being composed + # @param [Integer] bg The background color on which the color was composed. + # @param [Integer] The decomposed alpha value for the channel. + def decompose_alpha_component(channel, color, mask, bg) + ((send(channel, bg) - send(channel, color)).to_f / + (send(channel, bg) - send(channel, mask)).to_f * MAX).round + end + + # Decomposes the alpha channels for the r, g and b color channel. + # @param [Integer] color The color that was the result of compositing. + # @param [Integer] mask The opauqe variant of the color that was being composed + # @param [Integer] bg The background color on which the color was composed. + # @return [Array] The decomposed alpha values for the r, g and b channels. + def decompose_alpha_components(color, mask, bg) + [ + decompose_alpha_component(:r, color, mask, bg), + decompose_alpha_component(:g, color, mask, bg), + decompose_alpha_component(:b, color, mask, bg) + ] + end + + #################################################################### + # CONVERSIONS + #################################################################### + + # Returns a string representing this color using hex notation (i.e. #rrggbbaa). + # + # @param [Integer] value The color to convert. + # @return [String] The color in hex notation, starting with a pound sign. + def to_hex(color, include_alpha = true) + include_alpha ? ('#%08x' % color) : ('#%06x' % [color >> 8]) + end + + # Returns an array with the separate RGBA values for this color. + # + # @param [Integer] color The color to convert. + # @return [Array] An array with 4 Integer elements. + def to_truecolor_alpha_bytes(color) + [r(color), g(color), b(color), a(color)] + end + + # Returns an array with the separate RGB values for this color. + # The alpha channel will be discarded. + # + # @param [Integer] color The color to convert. + # @return [Array] An array with 3 Integer elements. + def to_truecolor_bytes(color) + [r(color), g(color), b(color)] + end + + # Returns an array with the grayscale teint value for this color. + # + # This method expects the r,g and b value to be equal, and the alpha + # channel will be discarded. + # + # @param [Integer] color The grayscale color to convert. + # @return [Array] An array with 1 Integer element. + def to_grayscale_bytes(color) + [b(color)] # assumption r == g == b + end + + # Returns an array with the grayscale teint and alpha channel values + # for this color. + # + # This method expects the r,g and b value to be equal. + # + # @param [Integer] color The grayscale color to convert. + # @return [Array] An array with 2 Integer elements. + def to_grayscale_alpha_bytes(color) + [b(color), a(color)] # assumption r == g == b + end + + #################################################################### + # COLOR CONSTANTS + #################################################################### + + # Black pixel/color + BLACK = rgb( 0, 0, 0) + + # White pixel/color + WHITE = rgb(255, 255, 255) + + # Fully transparent pixel/color + TRANSPARENT = rgba(0, 0, 0, 0) + + #################################################################### + # STATIC UTILITY METHODS + #################################################################### + + # Returns the number of sample values per pixel. + # @param [Integer] color_mode The color mode being used. + # @return [Integer] The number of sample values per pixel. + def samples_per_pixel(color_mode) + case color_mode + when ChunkyPNG::COLOR_INDEXED; 1 + when ChunkyPNG::COLOR_TRUECOLOR; 3 + when ChunkyPNG::COLOR_TRUECOLOR_ALPHA; 4 + when ChunkyPNG::COLOR_GRAYSCALE; 1 + when ChunkyPNG::COLOR_GRAYSCALE_ALPHA; 2 + else raise ChunkyPNG::NotSupported, "Don't know the numer of samples for this colormode: #{color_mode}!" + end + end + + # Returns the size in bytes of a pixel when it is stored using a given color mode. + # @param [Integer] color_mode The color mode in which the pixels are stored. + # @return [Integer] The number of bytes used per pixel in a datastream. + def pixel_bytesize(color_mode, depth = 8) + return 1 if depth < 8 + (pixel_bitsize(color_mode, depth) + 7) >> 3 + end + + # Returns the size in bits of a pixel when it is stored using a given color mode. + # @param [Integer] color_mode The color mode in which the pixels are stored. + # @param [Integer] depth The color depth of the pixels. + # @return [Integer] The number of bytes used per pixel in a datastream. + def pixel_bitsize(color_mode, depth = 8) + samples_per_pixel(color_mode) * depth + end + + # Returns the number of bytes used per scanline. + # @param [Integer] color_mode The color mode in which the pixels are stored. + # @param [Integer] depth The color depth of the pixels. + # @param [Integer] width The number of pixels per scanline. + # @return [Integer] The number of bytes used per scanline in a datastream. + def scanline_bytesize(color_mode, depth, width) + ((pixel_bitsize(color_mode, depth) * width) + 7) >> 3 + end + + # Returns the number of bytes used for an image pass + # @param [Integer] color_mode The color mode in which the pixels are stored. + # @param [Integer] depth The color depth of the pixels. + # @param [Integer] width The width of the image pass. + # @param [Integer] width The height of the image pass. + # @return [Integer] The number of bytes used per scanline in a datastream. + def pass_bytesize(color_mode, depth, width, height) + return 0 if width == 0 || height == 0 + (scanline_bytesize(color_mode, depth, width) + 1) * height + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/compatibility.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/compatibility.rb new file mode 100644 index 00000000..930202fa --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/compatibility.rb @@ -0,0 +1,15 @@ + +class String + alias_method :getbyte, :[] unless method_defined?(:getbyte) + alias_method :setbyte, :[]= unless method_defined?(:setbyte) + alias_method :bytesize, :size unless method_defined?(:bytesize) +end + +class Object + unless method_defined?(:tap) + def tap(&block) + yield(self) if block_given? + return self + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/datastream.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/datastream.rb new file mode 100644 index 00000000..098243fb --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/datastream.rb @@ -0,0 +1,185 @@ +module ChunkyPNG + + # The Datastream class represents a PNG formatted datastream. It supports + # both reading from and writing to strings, stremas and files. + # + # A PNG datastream begins with the PNG signature, and than contains multiple + # chunks, starting with a header (IHDR) chunk and finishing with an end + # (IEND) chunk. + # + # @see ChunkyPNG::Chunk + class Datastream + + # The signature that each PNG file or stream should begin with. + SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10].pack('C8') + + # The header chunk of this datastream. + # @return [ChunkyPNG::Chunk::Header] + attr_accessor :header_chunk + + # All other chunks in this PNG file. + # @return [Array] + attr_accessor :other_chunks + + # The chunk containing the image's palette. + # @return [ChunkyPNG::Chunk::Palette] + attr_accessor :palette_chunk + + # The chunk containing the transparency information of the palette. + # @return [ChunkyPNG::Chunk::Transparency] + attr_accessor :transparency_chunk + + # The chunks that together compose the images pixel data. + # @return [Array] + attr_accessor :data_chunks + + # The empty chunk that signals the end of this datastream + # @return [ChunkyPNG::Chunk::Header] + attr_accessor :end_chunk + + # Initializes a new Datastream instance. + def initialize + @other_chunks = [] + @data_chunks = [] + end + + ############################################################################## + # LOADING DATASTREAMS + ############################################################################## + + class << self + + # Reads a PNG datastream from a string. + # @param [String] str The PNG encoded string to load from. + # @return [ChunkyPNG::Datastream] The loaded datastream instance. + def from_blob(str) + from_io(StringIO.new(str)) + end + + alias :from_string :from_blob + + # Reads a PNG datastream from a file. + # @param [String] filename The path of the file to load from. + # @return [ChunkyPNG::Datastream] The loaded datastream instance. + def from_file(filename) + ds = nil + File.open(filename, 'rb') { |f| ds = from_io(f) } + ds + end + + # Reads a PNG datastream from an input stream + # @param [IO] io The stream to read from. + # @return [ChunkyPNG::Datastream] The loaded datastream instance. + def from_io(io) + verify_signature!(io) + + ds = self.new + until io.eof? + chunk = ChunkyPNG::Chunk.read(io) + case chunk + when ChunkyPNG::Chunk::Header; ds.header_chunk = chunk + when ChunkyPNG::Chunk::Palette; ds.palette_chunk = chunk + when ChunkyPNG::Chunk::Transparency; ds.transparency_chunk = chunk + when ChunkyPNG::Chunk::ImageData; ds.data_chunks << chunk + when ChunkyPNG::Chunk::End; ds.end_chunk = chunk + else ds.other_chunks << chunk + end + end + return ds + end + + # Verifies that the current stream is a PNG datastream by checking its signature. + # + # This method reads the PNG signature from the stream, setting the current position + # of the stream directly after the signature, where the IHDR chunk should begin. + # + # @param [IO] io The stream to read the PNG signature from. + # @raise [RuntimeError] An exception is raised if the PNG signature is not found at + # the beginning of the stream. + def verify_signature!(io) + signature = io.read(ChunkyPNG::Datastream::SIGNATURE.length) + unless signature == ChunkyPNG::Datastream::SIGNATURE + raise ChunkyPNG::SignatureMismatch, "PNG signature not found!" + end + end + end + + ################################################################################## + # CHUNKS + ################################################################################## + + # Enumerates the chunks in this datastream. + # + # This will iterate over the chunks using the order in which the chunks + # should appear in the PNG file. + # + # @yield [chunk] Yields the chunks in this datastrean, one by one in the correct order. + # @yieldparam [ChunkyPNG::Chunk::Base] chunk A chunk in this datastream. + # @see ChunkyPNG::Datastream#chunks + def each_chunk + yield(header_chunk) + other_chunks.each { |chunk| yield(chunk) } + yield(palette_chunk) if palette_chunk + yield(transparency_chunk) if transparency_chunk + data_chunks.each { |chunk| yield(chunk) } + yield(end_chunk) + end + + # Returns an enumerator instance for this datastream's chunks. + # @return [Enumerable::Enumerator] An enumerator for the :each_chunk method. + # @see ChunkyPNG::Datastream#each_chunk + def chunks + enum_for(:each_chunk) + end + + # Returns all the textual metadata key/value pairs as hash. + # @return [Hash] A hash containing metadata fields and their values. + def metadata + metadata = {} + other_chunks.select do |chunk| + metadata[chunk.keyword] = chunk.value if chunk.respond_to?(:keyword) + end + metadata + end + + # Returns the uncompressed image data, combined from all the IDAT chunks + # @return [String] The uncompressed image data for this datastream + def imagedata + ChunkyPNG::Chunk::ImageData.combine_chunks(data_chunks) + end + + ################################################################################## + # WRITING DATASTREAMS + ################################################################################## + + # Returns an empty stream using binary encoding that can be used as stream to encode to. + # @eturn [String] An empty, binary string. + def self.empty_bytearray + ChunkyPNG::EMPTY_BYTEARRAY.dup + end + + # Writes the datastream to the given output stream. + # @param [IO] io The output stream to write to. + def write(io) + io << SIGNATURE + each_chunk { |c| c.write(io) } + end + + # Saves this datastream as a PNG file. + # @param [String] filename The filename to use. + def save(filename) + File.open(filename, 'wb') { |f| write(f) } + end + + # Encodes this datastream into a string. + # @return [String] The encoded PNG datastream. + def to_blob + str = StringIO.new + write(str) + return str.string + end + + alias :to_string :to_blob + alias :to_s :to_blob + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/image.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/image.rb new file mode 100644 index 00000000..e821477d --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/image.rb @@ -0,0 +1,79 @@ +module ChunkyPNG + + # ChunkyPNG::Image is an extension of the {ChunkyPNG::Canvas} class, that + # also includes support for metadata. + # + # @see ChunkyPNG::Canvas + class Image < Canvas + + # The minimumsize of bytes the value of a metadata field should be before compression + # is enabled for the chunk. + METADATA_COMPRESSION_TRESHOLD = 300 + + # @return [Hash] The hash of metadata fields for this PNG image. + attr_accessor :metadata + + # Initializes a new ChunkyPNG::Image instance. + # @param [Integer] width The width of the new image. + # @param [Integer] height The height of the new image. + # @param [Integer] bg_color The background color of the new image. + # @param [Hash] metadata A hash of metadata fields and values for this image. + # @see ChunkyPNG::Canvas#initialize + def initialize(width, height, bg_color = ChunkyPNG::Color::TRANSPARENT, metadata = {}) + super(width, height, bg_color) + @metadata = metadata + end + + # Initializes a copy of another ChunkyPNG::Image instance. + # + # @param [ChunkyPNG::Image] other The other image to copy. + def initialize_copy(other) + super(other) + @metadata = other.metadata + end + + # Returns the metadata for this image as PNG chunks. + # + # Chunks will either be of the {ChunkyPNG::Chunk::Text} type for small + # values (in bytes), or of the {ChunkyPNG::Chunk::CompressedText} type + # for values that are larger in size. + # + # @return [Array] An array of metadata chunks. + # @see ChunkyPNG::Image::METADATA_COMPRESSION_TRESHOLD + def metadata_chunks + metadata.map do |key, value| + if value.length >= METADATA_COMPRESSION_TRESHOLD + ChunkyPNG::Chunk::CompressedText.new(key, value) + else + ChunkyPNG::Chunk::Text.new(key, value) + end + end + end + + # Encodes the image to a PNG datastream for saving to disk or writing to an IO stream. + # + # Besides encoding the canvas, it will also encode the metadata fields to text chunks. + # + # @param [Hash] constraints The constraints to use when encoding the canvas. + # @return [ChunkyPNG::Datastream] The datastream that contains this image. + # @see ChunkyPNG::Canvas::PNGEncoding#to_datastream + # @see #metadata_chunks + def to_datastream(constraints = {}) + ds = super(constraints) + ds.other_chunks += metadata_chunks + return ds + end + + # Reads a ChunkyPNG::Image intance from a data stream. + # + # Besides decoding the canvas, this will also read the metadata fields + # from the datastream. + # + # @param [ChunkyPNG::Datastream] The datastream to read from. + def self.from_datastream(ds) + image = super(ds) + image.metadata = ds.metadata + return image + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/palette.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/palette.rb new file mode 100644 index 00000000..54dfa0c4 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/palette.rb @@ -0,0 +1,187 @@ +module ChunkyPNG + + # A palette describes the set of colors that is being used for an image. + # + # A PNG image can contain an explicit palette which defines the colors of + # that image, but can also use an implicit palette, e.g. all truecolor + # colors or all grayscale colors. + # + # This palette supports decoding colors from a palette if an explicit + # palette is provided in a PNG datastream, and it supports encoding colors + # to an explicit palette (stores as PLTE & tRNS chunks in a PNG file). + # + # @see ChunkyPNG::Color + class Palette < SortedSet + + # Builds a new palette given a set (Enumerable instance) of colors. + # + # @param [Enumerbale] enum The set of colors to include in this palette. + # This Enumerbale can contains duplicates. + # @param [Array] decoding_map An array of colors in the exact order at which + # they appeared in the palette chunk, so that this array can be used for decoding. + def initialize(enum, decoding_map = nil) + super(enum) + @decoding_map = decoding_map if decoding_map + end + + # Builds a palette instance from a PLTE chunk and optionally a tRNS chunk + # from a PNG datastream. + # + # This method will cerate a palette that is suitable for decoding an image. + # + # @param [ChunkyPNG::Chunk::Palette] The palette chunk to load from + # @param [ChunkyPNG::Chunk::Transparency, nil] The optional transparency chunk. + # @return [ChunkyPNG::Palette] The loaded palette instance. + # @see ChunkyPNG::Palette#can_decode? + def self.from_chunks(palette_chunk, transparency_chunk = nil) + return nil if palette_chunk.nil? + + decoding_map = [] + index = 0 + + palatte_bytes = palette_chunk.content.unpack('C*') + if transparency_chunk + alpha_channel = transparency_chunk.content.unpack('C*') + else + alpha_channel = [] + end + + index = 0 + palatte_bytes.each_slice(3) do |bytes| + bytes << alpha_channel.fetch(index, ChunkyPNG::Color::MAX) + decoding_map << ChunkyPNG::Color.rgba(*bytes) + index += 1 + end + + self.new(decoding_map, decoding_map) + end + + # Builds a palette instance from a given canvas. + # @param [ChunkyPNG::Canvas] canvas The canvas to create a palette for. + # @return [ChunkyPNG::Palette] The palette instance. + def self.from_canvas(canvas) + self.new(canvas.pixels) + end + + # Builds a palette instance from a given set of pixels. + # @param [Enumerable] pixels An enumeration of pixels to create a palette for + # @return [ChunkyPNG::Palette] The palette instance. + def self.from_pixels(pixels) + self.new(pixels) + end + + # Checks whether the size of this palette is suitable for indexed storage. + # @return [true, false] True if the number of colors in this palette is at most 256. + def indexable? + size <= 256 + end + + # Check whether this pelette only contains opaque colors. + # @return [true, false] True if all colors in this palette are opaque. + # @see ChunkyPNG::Color#opaque? + def opaque? + all? { |color| Color.opaque?(color) } + end + + # Check whether this pelette only contains grayscale colors. + # @return [true, false] True if all colors in this palette are grayscale teints. + # @see ChunkyPNG::Color#grayscale?? + def grayscale? + all? { |color| Color.grayscale?(color) } + end + + # Returns a palette with all the opaque variants of the colors in this palette. + # @return [ChunkyPNG::Palette] A new Palette instance with only opaque colors. + # @see ChunkyPNG::Color#opaque! + def opaque_palette + self.class.new(map { |c| ChunkyPNG::Color.opaque!(c) }) + end + + # Checks whether this palette is suitable for decoding an image from a datastream. + # + # This requires that the positions of the colors in the original palette chunk is known, + # which is stored as an array in the +@decoding_map+ instance variable. + # + # @return [true, false] True if a decoding map was built when this palette was loaded. + def can_decode? + !@decoding_map.nil? + end + + # Checks whether this palette is suitable for encoding an image from to datastream. + # + # This requires that the position of the color in the future palette chunk is known, + # which is stored as a hash in the +@encoding_map+ instance variable. + # + # @return [true, false] True if a encoding map was built when this palette was loaded. + def can_encode? + !@encoding_map.nil? + end + + # Returns a color, given the position in the original palette chunk. + # @param [Integer] index The 0-based position of the color in the palette. + # @return [ChunkyPNG::Color] The color that is stored in the palette under the given index + # @see ChunkyPNG::Palette#can_decode? + def [](index) + @decoding_map[index] + end + + # Returns the position of a color in the palette + # @param [ChunkyPNG::Color] color The color for which to look up the index. + # @return [Integer] The 0-based position of the color in the palette. + # @see ChunkyPNG::Palette#can_encode? + def index(color) + @encoding_map[color] + end + + # Creates a tRNS chunk that corresponds with this palette to store the + # alpha channel of all colors. + # + # Note that this chunk can be left out of every color in the palette is + # opaque, and the image is encoded using indexed colors. + # + # @return [ChunkyPNG::Chunk::Transparency] The tRNS chunk. + def to_trns_chunk + ChunkyPNG::Chunk::Transparency.new('tRNS', map { |c| ChunkyPNG::Color.a(c) }.pack('C*')) + end + + # Creates a PLTE chunk that corresponds with this palette to store the + # r, g and b channels of all colors. + # + # Note that a PLTE chunk should only be included if the image is + # encoded using index colors. After this chunk has been built, the + # palette becomes suitable for encoding an image. + # + # @return [ChunkyPNG::Chunk::Palette] The PLTE chunk. + # @see ChunkyPNG::Palette#can_encode? + def to_plte_chunk + @encoding_map = {} + colors = [] + + each_with_index do |color, index| + @encoding_map[color] = index + colors += ChunkyPNG::Color.to_truecolor_bytes(color) + end + + ChunkyPNG::Chunk::Palette.new('PLTE', colors.pack('C*')) + end + + # Determines the most suitable colormode for this palette. + # @return [Integer] The colormode which would create the smalles possible + # file for images that use this exact palette. + def best_colormode + if grayscale? + if opaque? + ChunkyPNG::COLOR_GRAYSCALE + else + ChunkyPNG::COLOR_GRAYSCALE_ALPHA + end + elsif indexable? + ChunkyPNG::COLOR_INDEXED + elsif opaque? + ChunkyPNG::COLOR_TRUECOLOR + else + ChunkyPNG::COLOR_TRUECOLOR_ALPHA + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/rmagick.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/rmagick.rb new file mode 100644 index 00000000..be24ce3a --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/lib/chunky_png/rmagick.rb @@ -0,0 +1,43 @@ +require 'rmagick' + +module ChunkyPNG + + # Methods for importing and exporting RMagick image objects. + # + # By default, this module is disabled because of the dependency on RMagick. + # You need to include this module yourself if you want to use it. + # + # @example + # + # require 'rmagick' + # require 'chunky_png/rmagick' + # + # canvas = ChunkyPNG::Canvas.from_file('filename.png') + # image = ChunkyPNG::RMagick.export(canvas) + # + # # do something with the image using RMagick + # + # updated_canvas = ChunkyPNG::RMagick.import(image) + # + module RMagick + + extend self + + # Imports an RMagick image as Canvas object. + # @param [Magick::Image] image The image to import + # @return [ChunkyPNG::Canvas] The canvas, constructed from the RMagick image. + def import(image) + pixels = image.export_pixels_to_str(0, 0, image.columns, image.rows, 'RGBA') + ChunkyPNG::Canvas.from_rgba_stream(image.columns, image.rows, pixels) + end + + # Exports a Canvas as RMagick image instance. + # @param [ChunkyPNG::Canvas] canvas The canvas to export. + # @return [Magick::Image] The RMagick image constructed from the Canvas instance. + def export(canvas) + image = Magick::Image.new(canvas.width, canvas.height) + image.import_pixels(0,0, canvas.width, canvas.height, 'RGBA', canvas.pixels.pack('N*')) + image + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/adam7_interlacing_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/adam7_interlacing_spec.rb new file mode 100644 index 00000000..48a9b0a8 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/adam7_interlacing_spec.rb @@ -0,0 +1,106 @@ +require 'spec_helper' + +describe ChunkyPNG::Canvas::Adam7Interlacing do + include ChunkyPNG::Canvas::Adam7Interlacing + + describe '#adam7_pass_sizes' do + it "should get the pass sizes for a 8x8 image correctly" do + adam7_pass_sizes(8, 8).should == [ + [1, 1], [1, 1], [2, 1], [2, 2], [4, 2], [4, 4], [8, 4] + ] + end + + it "should get the pass sizes for a 12x12 image correctly" do + adam7_pass_sizes(12, 12).should == [ + [2, 2], [1, 2], [3, 1], [3, 3], [6, 3], [6, 6], [12, 6] + ] + end + + it "should get the pass sizes for a 33x47 image correctly" do + adam7_pass_sizes(33, 47).should == [ + [5, 6], [4, 6], [9, 6], [8, 12], [17, 12], [16, 24], [33, 23] + ] + end + + it "should get the pass sizes for a 1x1 image correctly" do + adam7_pass_sizes(1, 1).should == [ + [1, 1], [0, 1], [1, 0], [0, 1], [1, 0], [0, 1], [1, 0] + ] + end + + it "should get the pass sizes for a 0x0 image correctly" do + adam7_pass_sizes(0, 0).should == [ + [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0] + ] + end + + it "should always maintain the same amount of pixels in total" do + [[8, 8], [12, 12], [33, 47], [1, 1], [0, 0]].each do |(width, height)| + pass_sizes = adam7_pass_sizes(width, height) + pass_sizes.inject(0) { |sum, (w, h)| sum + (w*h) }.should == width * height + end + end + end + + describe '#adam7_multiplier_offset' do + it "should get the multiplier and offset values for pass 1 correctly" do + adam7_multiplier_offset(0).should == [3, 0, 3, 0] + end + + it "should get the multiplier and offset values for pass 2 correctly" do + adam7_multiplier_offset(1).should == [3, 4, 3, 0] + end + + it "should get the multiplier and offset values for pass 3 correctly" do + adam7_multiplier_offset(2).should == [2, 0, 3, 4] + end + + it "should get the multiplier and offset values for pass 4 correctly" do + adam7_multiplier_offset(3).should == [2, 2, 2, 0] + end + + it "should get the multiplier and offset values for pass 5 correctly" do + adam7_multiplier_offset(4).should == [1, 0, 2, 2] + end + + it "should get the multiplier and offset values for pass 6 correctly" do + adam7_multiplier_offset(5).should == [1, 1, 1, 0] + end + + it "should get the multiplier and offset values for pass 7 correctly" do + adam7_multiplier_offset(6).should == [0, 0, 1, 1] + end + end + + describe '#adam7_merge_pass' do + it "should merge the submatrices correctly" do + submatrices = [ + ChunkyPNG::Canvas.new(1, 1, 168430335), # r = 10 + ChunkyPNG::Canvas.new(1, 1, 336860415), # r = 20 + ChunkyPNG::Canvas.new(2, 1, 505290495), # r = 30 + ChunkyPNG::Canvas.new(2, 2, 677668095), # r = 40 + ChunkyPNG::Canvas.new(4, 2, 838912255), # r = 50 + ChunkyPNG::Canvas.new(4, 4, 1023344895), # r = 60 + ChunkyPNG::Canvas.new(8, 4, 1175063295), # r = 70 + ] + + canvas = ChunkyPNG::Image.new(8,8) + submatrices.each_with_index { |m, pass| adam7_merge_pass(pass, canvas, m) } + canvas.should == reference_image('adam7') + end + end + + describe '#adam7_extract_pass' do + before(:each) { @canvas = reference_canvas('adam7') } + + 1.upto(7) do |pass| + it "should extract pass #{pass} correctly" do + sm = adam7_extract_pass(pass - 1, @canvas) + sm.pixels.length.should == sm.width * sm.height + sm.pixels.uniq.length.should == 1 + ChunkyPNG::Color.r(sm[0,0]).should == pass * 10 + end + end + end + +end \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/drawing_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/drawing_spec.rb new file mode 100644 index 00000000..e1bcecaf --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/drawing_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +describe ChunkyPNG::Canvas::Drawing do + + describe '#point' do + it "should compose colors correctly" do + canvas = ChunkyPNG::Canvas.new(1, 1, ChunkyPNG::Color.rgb(200, 150, 100)) + canvas.point(0,0, ChunkyPNG::Color.rgba(100, 150, 200, 128)) + canvas[0,0].should == ChunkyPNG::Color.rgb(150, 150, 150) + end + end + + describe '#line' do + it "should draw lines correctly with anti-aliasing" do + canvas = ChunkyPNG::Canvas.new(32, 32, ChunkyPNG::Color::WHITE) + + canvas.line( 0, 0, 31, 31, ChunkyPNG::Color::BLACK) + canvas.line( 0, 31, 31, 0, ChunkyPNG::Color::BLACK) + canvas.line(15, 31, 15, 0, ChunkyPNG::Color.rgba(200, 0, 0, 128)) + canvas.line( 0, 15, 31, 15, ChunkyPNG::Color.rgba(200, 0, 0, 128)) + canvas.line( 0, 15, 31, 31, ChunkyPNG::Color.rgba( 0, 200, 0, 128)) + canvas.line( 0, 15, 31, 0, ChunkyPNG::Color.rgba( 0, 200, 0, 128)) + canvas.line(15, 0, 31, 31, ChunkyPNG::Color.rgba( 0, 0, 200, 128)) + canvas.line(15, 0, 0, 31, ChunkyPNG::Color.rgba( 0, 0, 200, 128)) + + canvas.should == reference_canvas('lines') + end + end + + describe '#rect' do + it "should draw a rectangle with the correct colors" do + canvas = ChunkyPNG::Canvas.new(16, 16, ChunkyPNG::Color::WHITE) + canvas.rect(1, 1, 10, 10, ChunkyPNG::Color.rgb(0, 255, 0), ChunkyPNG::Color.rgba(255, 0, 0, 100)) + canvas.rect(5, 5, 14, 14, ChunkyPNG::Color.rgb(0, 0, 255), ChunkyPNG::Color.rgba(255, 255, 0, 100)) + canvas.should == reference_canvas('rect') + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/operations_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/operations_spec.rb new file mode 100644 index 00000000..c59e49d6 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/operations_spec.rb @@ -0,0 +1,173 @@ +require 'spec_helper' + +describe ChunkyPNG::Canvas::Operations do + describe '#crop' do + before { @canvas = reference_canvas('operations') } + + it "should crop the right pixels from the original canvas" do + cropped = @canvas.crop(10, 5, 4, 8) + cropped.should == reference_canvas('cropped') + end + + it "should raise an exception when the cropped image falls outside the oiginal image" do + lambda { @canvas.crop(16, 16, 2, 2) }.should raise_error(ChunkyPNG::OutOfBounds) + end + end + + describe '#compose' do + it "should compose pixels correctly" do + canvas = reference_canvas('operations') + subcanvas = ChunkyPNG::Canvas.new(4, 8, ChunkyPNG::Color.rgba(0, 0, 0, 75)) + canvas.compose(subcanvas, 8, 4) + canvas.should == reference_canvas('composited') + end + + it "should compose a base image and mask correctly" do + base = reference_canvas('clock_base') + mask = reference_canvas('clock_mask_updated') + base.compose(mask).should == reference_canvas('clock_updated') + end + + it "should raise an exception when the pixels to compose fall outside the image" do + lambda { reference_canvas('operations').compose(ChunkyPNG::Canvas.new(1,1), 16, 16) }.should raise_error(ChunkyPNG::OutOfBounds) + end + end + + describe '#replace' do + before { @canvas = reference_canvas('operations') } + + it "should replace the correct pixels" do + subcanvas = ChunkyPNG::Canvas.new(3, 2, ChunkyPNG::Color.rgb(200, 255, 0)) + @canvas.replace(subcanvas, 5, 4) + @canvas.should == reference_canvas('replaced') + end + + it "should raise an exception when the pixels to replace fall outside the image" do + lambda { @canvas.replace(ChunkyPNG::Canvas.new(1,1), 16, 16) }.should raise_error(ChunkyPNG::OutOfBounds) + end + end + + describe '#change_theme_color!' do + + before(:each) do + @theme_color = ChunkyPNG::Color.from_hex('#e10f7a') + @new_color = ChunkyPNG::Color.from_hex('#ff0000') + @canvas = reference_canvas('clock') + end + + it "should change the theme color correctly" do + @canvas.change_theme_color!(@theme_color, @new_color) + @canvas.should == reference_canvas('clock_updated') + end + end + + describe '#extract_mask' do + before(:each) do + @mask_color = ChunkyPNG::Color.from_hex('#e10f7a') + @canvas = reference_canvas('clock') + end + + it "should create the correct base and mask image" do + base, mask = @canvas.extract_mask(@mask_color, ChunkyPNG::Color::WHITE) + base.should == reference_canvas('clock_base') + mask.should == reference_canvas('clock_mask') + end + + it "should create a mask image with only one opaque color" do + base, mask = @canvas.extract_mask(@mask_color, ChunkyPNG::Color::WHITE) + mask.palette.opaque_palette.size.should == 1 + end + end + + describe '#change_mask_color!' do + before(:each) do + @new_color = ChunkyPNG::Color.from_hex('#ff0000') + @mask = reference_canvas('clock_mask') + end + + it "should replace the mask color correctly" do + @mask.change_mask_color!(@new_color) + @mask.should == reference_canvas('clock_mask_updated') + end + + it "should still only have one opaque color" do + @mask.change_mask_color!(@new_color) + @mask.palette.opaque_palette.size.should == 1 + end + + it "should raise an exception when the mask image has more than once color" do + not_a_mask = reference_canvas('operations') + lambda { not_a_mask.change_mask_color!(@new_color) }.should raise_error(ChunkyPNG::ExpectationFailed) + end + end +end + +describe ChunkyPNG::Canvas::Operations do + before { @stubbed = reference_canvas('clock_stubbed') } + + describe '#flip_horizontally' do + it "should flip the pixels horizontally" do + @stubbed.flip_horizontally.should == reference_canvas('clock_flip_horizontally') + end + + it "should return itself when applied twice" do + @stubbed.flip_horizontally.flip_horizontally.should == @stubbed + end + end + + describe '#flip_vertically' do + it "should flip the pixels vertically" do + @stubbed.flip_vertically.should == reference_canvas('clock_flip_vertically') + end + + it "should return itself when applied twice" do + @stubbed.flip_vertically.flip_vertically.should == @stubbed + end + end + + describe '#rotate_left' do + it "should rotate the pixels 90 degrees counter-clockwise" do + @stubbed.rotate_left.should == reference_canvas('clock_rotate_left') + end + + it "it should rotate 180 degrees when applied twice" do + @stubbed.rotate_left.rotate_left.should == reference_canvas('clock_rotate_180') + end + + it "it should rotate right when applied three times" do + @stubbed.rotate_left.rotate_left.rotate_left.should == reference_canvas('clock_rotate_right') + end + + it "should return itself when applied four times" do + @stubbed.rotate_left.rotate_left.rotate_left.rotate_left.should == @stubbed + end + end + + describe '#rotate_right' do + it "should rotate the pixels 90 degrees clockwise" do + @stubbed.rotate_right.should == reference_canvas('clock_rotate_right') + end + + it "it should rotate 180 degrees when applied twice" do + @stubbed.rotate_right.rotate_right.should == reference_canvas('clock_rotate_180') + end + + it "it should rotate left when applied three times" do + @stubbed.rotate_right.rotate_right.rotate_right.should == reference_canvas('clock_rotate_left') + end + + it "should return itself when applied four times" do + @stubbed.rotate_right.rotate_right.rotate_right.rotate_right.should == @stubbed + end + end + + describe '#rotate_180' do + it "should rotate the pixels 180 degrees" do + @stubbed.rotate_180.should == reference_canvas('clock_rotate_180') + end + + it "should return itself when applied twice" do + @stubbed.rotate_180.rotate_180.should == @stubbed + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/png_decoding_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/png_decoding_spec.rb new file mode 100644 index 00000000..59bc6112 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/png_decoding_spec.rb @@ -0,0 +1,97 @@ +require 'spec_helper' + +describe ChunkyPNG::Canvas::PNGDecoding do + include ChunkyPNG::Canvas::PNGDecoding + + describe '#decode_png_scanline' do + + it "should decode a line without filtering as is" do + stream = [ChunkyPNG::FILTER_NONE, 255, 255, 255, 255, 255, 255, 255, 255, 255].pack('C*') + decode_png_str_scanline(stream, 0, nil, 9, 3) + stream.unpack('@1C*').should == [255, 255, 255, 255, 255, 255, 255, 255, 255] + end + + it "should decode a line with sub filtering correctly" do + # all white pixels + stream = [ChunkyPNG::FILTER_SUB, 255, 255, 255, 0, 0, 0, 0, 0, 0].pack('C*') + decode_png_str_scanline(stream, 0, nil, 9, 3) + stream.unpack('@1C*').should == [255, 255, 255, 255, 255, 255, 255, 255, 255] + + # all black pixels + stream = [ChunkyPNG::FILTER_SUB, 0, 0, 0, 0, 0, 0, 0, 0, 0].pack('C*') + decode_png_str_scanline(stream, 0, nil, 9, 3) + stream.unpack('@1C*').should == [0, 0, 0, 0, 0, 0, 0, 0, 0] + + # various colors + stream = [ChunkyPNG::FILTER_SUB, 255, 0, 45, 0, 255, 0, 112, 200, 178].pack('C*') + decode_png_str_scanline(stream, 0, nil, 9, 3) + stream.unpack('@1C*').should == [255, 0, 45, 255, 255, 45, 111, 199, 223] + end + + it "should decode a line with up filtering correctly" do + # previous line has various pixels + previous = [ChunkyPNG::FILTER_UP, 255, 255, 255, 127, 127, 127, 0, 0, 0] + current = [ChunkyPNG::FILTER_UP, 0, 127, 255, 0, 127, 255, 0, 127, 255] + stream = (previous + current).pack('C*') + decode_png_str_scanline(stream, 10, 0, 9, 3) + stream.unpack('@11C9').should == [255, 126, 254, 127, 254, 126, 0, 127, 255] + end + + it "should decode a line with average filtering correctly" do + previous = [ChunkyPNG::FILTER_AVERAGE, 10, 20, 30, 40, 50, 60, 70, 80, 80, 100, 110, 120] + current = [ChunkyPNG::FILTER_AVERAGE, 0, 0, 10, 23, 15, 13, 23, 63, 38, 60, 253, 53] + stream = (previous + current).pack('C*') + decode_png_str_scanline(stream, 13, 0, 12, 3) + stream.unpack('@14C12').should == [5, 10, 25, 45, 45, 55, 80, 125, 105, 150, 114, 165] + end + + it "should decode a line with paeth filtering correctly" do + previous = [ChunkyPNG::FILTER_PAETH, 10, 20, 30, 40, 50, 60, 70, 80, 80, 100, 110, 120] + current = [ChunkyPNG::FILTER_PAETH, 0, 0, 10, 20, 10, 0, 0, 40, 10, 20, 190, 0] + stream = (previous + current).pack('C*') + decode_png_str_scanline(stream, 13, 0, 12, 3) + stream.unpack('@14C12').should == [10, 20, 40, 60, 60, 60, 70, 120, 90, 120, 54, 120] + end + end + + describe '#decode_png_extract_4bit_value' do + it "should extract the high bits successfully" do + decode_png_extract_4bit_value('10010110'.to_i(2), 0).should == '1001'.to_i(2) + end + + it "should extract the low bits successfully" do + decode_png_extract_4bit_value('10010110'.to_i(2), 17).should == '0110'.to_i(2) + end + end + + describe '#decode_png_extract_2bit_value' do + it "should extract the first 2 bits successfully" do + decode_png_extract_2bit_value('10010110'.to_i(2), 0).should == '10'.to_i(2) + end + + it "should extract the second 2 bits successfully" do + decode_png_extract_2bit_value('10010110'.to_i(2), 5).should == '01'.to_i(2) + end + + it "should extract the third 2 bits successfully" do + decode_png_extract_2bit_value('10010110'.to_i(2), 2).should == '01'.to_i(2) + end + + it "should extract the low two bits successfully" do + decode_png_extract_2bit_value('10010110'.to_i(2), 7).should == '10'.to_i(2) + end + end + + describe '#decode_png_extract_1bit_value' do + it "should extract all separate bits correctly" do + decode_png_extract_1bit_value('10010110'.to_i(2), 0).should == 1 + decode_png_extract_1bit_value('10010110'.to_i(2), 1).should == 0 + decode_png_extract_1bit_value('10010110'.to_i(2), 2).should == 0 + decode_png_extract_1bit_value('10010110'.to_i(2), 3).should == 1 + decode_png_extract_1bit_value('10010110'.to_i(2), 4).should == 0 + decode_png_extract_1bit_value('10010110'.to_i(2), 5).should == 1 + decode_png_extract_1bit_value('10010110'.to_i(2), 6).should == 1 + decode_png_extract_1bit_value('10010110'.to_i(2), 7).should == 0 + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/png_encoding_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/png_encoding_spec.rb new file mode 100644 index 00000000..68f714ce --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas/png_encoding_spec.rb @@ -0,0 +1,171 @@ +require 'spec_helper' + +describe ChunkyPNG::Canvas::PNGEncoding do + include ChunkyPNG::Canvas::PNGEncoding + + describe '.encode_png' do + [:indexed, :grayscale, :grayscale_alpha, :truecolor, :truecolor_alpha].each do |color_mode_name| + it "should encode an image with color mode #{color_mode_name} correctly" do + filename = resource_file("_tmp_#{color_mode_name}.png") + canvas = ChunkyPNG::Canvas.new(10, 10, ChunkyPNG::Color.rgb(100, 100, 100)) + color_mode = ChunkyPNG.const_get("COLOR_#{color_mode_name.to_s.upcase}") + canvas.save(filename, :color_mode => color_mode) + + ds = ChunkyPNG::Datastream.from_file(filename) + ds.header_chunk.color.should == color_mode + ChunkyPNG::Canvas.from_datastream(ds).should == ChunkyPNG::Canvas.new(10, 10, ChunkyPNG::Color.rgb(100, 100, 100)) + + File.unlink(filename) + end + end + + it "should encode an image with interlacing correctly" do + input_canvas = ChunkyPNG::Canvas.from_file(resource_file('operations.png')) + filename = resource_file("_tmp_interlaced.png") + input_canvas.save(filename, :interlace => true) + + ds = ChunkyPNG::Datastream.from_file(filename) + ds.header_chunk.interlace.should == ChunkyPNG::INTERLACING_ADAM7 + ChunkyPNG::Canvas.from_datastream(ds).should == input_canvas + + File.unlink(filename) + end + + it "should save an image using the normal routine correctly" do + canvas = reference_canvas('operations') + Zlib::Deflate.should_receive(:deflate).with(anything, Zlib::DEFAULT_COMPRESSION).and_return('') + canvas.to_blob + end + + it "should save an image using the :fast_rgba routine correctly" do + canvas = reference_canvas('operations') + canvas.should_not_receive(:encode_png_str_scanline_none) + canvas.should_not_receive(:encode_png_str_scanline_sub) + canvas.should_not_receive(:encode_png_str_scanline_up) + canvas.should_not_receive(:encode_png_str_scanline_average) + canvas.should_not_receive(:encode_png_str_scanline_paeth) + Zlib::Deflate.should_receive(:deflate).with(anything, Zlib::BEST_SPEED).and_return('') + canvas.to_blob(:fast_rgba) + end + + it "should save an image using the :good_compression routine correctly" do + canvas = reference_canvas('operations') + canvas.should_not_receive(:encode_png_str_scanline_none) + canvas.should_not_receive(:encode_png_str_scanline_sub) + canvas.should_not_receive(:encode_png_str_scanline_up) + canvas.should_not_receive(:encode_png_str_scanline_average) + canvas.should_not_receive(:encode_png_str_scanline_paeth) + Zlib::Deflate.should_receive(:deflate).with(anything, Zlib::BEST_COMPRESSION).and_return('') + canvas.to_blob(:good_compression) + end + + it "should save an image using the :best_compression routine correctly" do + canvas = reference_canvas('operations') + canvas.should_receive(:encode_png_str_scanline_paeth).exactly(canvas.height).times + Zlib::Deflate.should_receive(:deflate).with(anything, Zlib::BEST_COMPRESSION).and_return('') + canvas.to_blob(:best_compression) + end + end + + describe '#encode_png_image_pass_to_stream' do + before { @canvas = ChunkyPNG::Canvas.new(2, 2, ChunkyPNG::Color.rgba(1, 2, 3, 4)) } + + it "should encode using RGBA / no filtering mode correctly" do + @canvas.encode_png_image_pass_to_stream(stream = ChunkyPNG::Datastream.empty_bytearray, ChunkyPNG::COLOR_TRUECOLOR_ALPHA, ChunkyPNG::FILTER_NONE) + stream.should == "\0\1\2\3\4\1\2\3\4\0\1\2\3\4\1\2\3\4" + end + + it "should encode using RGBA / SUB filtering mode correctly" do + @canvas.encode_png_image_pass_to_stream(stream = ChunkyPNG::Datastream.empty_bytearray, ChunkyPNG::COLOR_TRUECOLOR_ALPHA, ChunkyPNG::FILTER_SUB) + stream.should == "\1\1\2\3\4\0\0\0\0\1\1\2\3\4\0\0\0\0" + end + + it "should encode using RGBA / UP filtering mode correctly" do + @canvas.encode_png_image_pass_to_stream(stream = ChunkyPNG::Datastream.empty_bytearray, ChunkyPNG::COLOR_TRUECOLOR_ALPHA, ChunkyPNG::FILTER_UP) + stream.should == "\2\1\2\3\4\1\2\3\4\2\0\0\0\0\0\0\0\0" + end + + it "should encode using RGBA / AVERAGE filtering mode correctly" do + @canvas.encode_png_image_pass_to_stream(stream = ChunkyPNG::Datastream.empty_bytearray, ChunkyPNG::COLOR_TRUECOLOR_ALPHA, ChunkyPNG::FILTER_AVERAGE) + stream.should == "\3\1\2\3\4\1\1\2\2\3\1\1\2\2\0\0\0\0" + end + + it "should encode using RGB / no filtering mode correctly" do + @canvas.encode_png_image_pass_to_stream(stream = ChunkyPNG::Datastream.empty_bytearray, ChunkyPNG::COLOR_TRUECOLOR, ChunkyPNG::FILTER_NONE) + stream.should == "\0\1\2\3\1\2\3\0\1\2\3\1\2\3" + end + + it "should encode using indexed / no filtering mode correctly" do + @canvas.stub(:encoding_palette).and_return(mock('Palette', :index => 1)) + @canvas.encode_png_image_pass_to_stream(stream = ChunkyPNG::Datastream.empty_bytearray, ChunkyPNG::COLOR_INDEXED, ChunkyPNG::FILTER_NONE) + stream.should == "\0\1\1\0\1\1" + end + + it "should encode using indexed / PAETH filtering mode correctly" do + @canvas.stub(:encoding_palette).and_return(mock('Palette', :index => 1)) + @canvas.encode_png_image_pass_to_stream(stream = ChunkyPNG::Datastream.empty_bytearray, ChunkyPNG::COLOR_INDEXED, ChunkyPNG::FILTER_PAETH) + stream.should == "\4\1\0\4\0\0" + end + end + + describe '#encode_png_str_scanline' do + + it "should encode a scanline without filtering correctly" do + stream = [ChunkyPNG::FILTER_NONE, 0, 0, 0, 1, 1, 1, 2, 2, 2].pack('C*') + encode_png_str_scanline_none(stream, 0, nil, 9, 3) + stream.unpack('C*').should == [ChunkyPNG::FILTER_NONE, 0, 0, 0, 1, 1, 1, 2, 2, 2] + end + + it "should encode a scanline with sub filtering correctly" do + stream = [ChunkyPNG::FILTER_NONE, 255, 255, 255, 255, 255, 255, 255, 255, 255, + ChunkyPNG::FILTER_NONE, 255, 255, 255, 255, 255, 255, 255, 255, 255].pack('C*') + + # Check line with previous line + encode_png_str_scanline_sub(stream, 10, 0, 9, 3) + stream.unpack('@10C10').should == [ChunkyPNG::FILTER_SUB, 255, 255, 255, 0, 0, 0, 0, 0, 0] + + # Check line without previous line + encode_png_str_scanline_sub(stream, 0, nil, 9, 3) + stream.unpack('@0C10').should == [ChunkyPNG::FILTER_SUB, 255, 255, 255, 0, 0, 0, 0, 0, 0] + end + + it "should encode a scanline with up filtering correctly" do + stream = [ChunkyPNG::FILTER_NONE, 255, 255, 255, 255, 255, 255, 255, 255, 255, + ChunkyPNG::FILTER_NONE, 255, 255, 255, 255, 255, 255, 255, 255, 255].pack('C*') + + # Check line with previous line + encode_png_str_scanline_up(stream, 10, 0, 9, 3) + stream.unpack('@10C10').should == [ChunkyPNG::FILTER_UP, 0, 0, 0, 0, 0, 0, 0, 0, 0] + + # Check line without previous line + encode_png_str_scanline_up(stream, 0, nil, 9, 3) + stream.unpack('@0C10').should == [ChunkyPNG::FILTER_UP, 255, 255, 255, 255, 255, 255, 255, 255, 255] + end + + it "should encode a scanline with average filtering correctly" do + stream = [ChunkyPNG::FILTER_NONE, 10, 20, 30, 40, 50, 60, 70, 80, 80, 100, 110, 120, + ChunkyPNG::FILTER_NONE, 5, 10, 25, 45, 45, 55, 80, 125, 105, 150, 114, 165].pack('C*') + + # Check line with previous line + encode_png_str_scanline_average(stream, 13, 0, 12, 3) + stream.unpack('@13C13').should == [ChunkyPNG::FILTER_AVERAGE, 0, 0, 10, 23, 15, 13, 23, 63, 38, 60, 253, 53] + + # Check line without previous line + encode_png_str_scanline_average(stream, 0, nil, 12, 3) + stream.unpack('@0C13').should == [ChunkyPNG::FILTER_AVERAGE, 10, 20, 30, 35, 40, 45, 50, 55, 50, 65, 70, 80] + end + + it "should encode a scanline with paeth filtering correctly" do + stream = [ChunkyPNG::FILTER_NONE, 10, 20, 30, 40, 50, 60, 70, 80, 80, 100, 110, 120, + ChunkyPNG::FILTER_NONE, 10, 20, 40, 60, 60, 60, 70, 120, 90, 120, 54, 120].pack('C*') + + # Check line with previous line + encode_png_str_scanline_paeth(stream, 13, 0, 12, 3) + stream.unpack('@13C13').should == [ChunkyPNG::FILTER_PAETH, 0, 0, 10, 20, 10, 0, 0, 40, 10, 20, 190, 0] + + # Check line without previous line + encode_png_str_scanline_paeth(stream, 0, nil, 12, 3) + stream.unpack('@0C13').should == [ChunkyPNG::FILTER_PAETH, 10, 20, 30, 30, 30, 30, 30, 30, 20, 30, 30, 40] + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas_spec.rb new file mode 100644 index 00000000..e6e6747d --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/canvas_spec.rb @@ -0,0 +1,68 @@ +require 'spec_helper' + +describe ChunkyPNG::Canvas do + + describe '.from_rgb_stream' do + it "should load an image correctly from a datastream" do + File.open(resource_file('pixelstream.rgb')) do |stream| + matrix = ChunkyPNG::Canvas.from_rgb_stream(240, 180, stream) + matrix.should == reference_canvas('pixelstream_reference') + end + end + end + + describe '.from_rgba_stream' do + it "should load an image correctly from a datastream" do + File.open(resource_file('pixelstream.rgba')) do |stream| + matrix = ChunkyPNG::Canvas.from_rgba_stream(240, 180, stream) + matrix.should == reference_canvas('pixelstream_reference') + end + end + end + + describe '#to_rgba_stream' do + before { File.open(resource_file('pixelstream.rgba'), 'rb') { |f| @reference_data = f.read } } + + it "should load an image correctly from a datastream" do + reference_canvas('pixelstream_reference').to_rgba_stream.should == @reference_data + end + end + + describe '#to_rgb_stream' do + before { File.open(resource_file('pixelstream.rgb'), 'rb') { |f| @reference_data = f.read } } + + it "should load an image correctly from a datastream" do + reference_canvas('pixelstream_reference').to_rgb_stream.should == @reference_data + end + end + + describe '#row' do + before { @canvas = reference_canvas('operations') } + + it "should give an out of bounds exception when y-coordinate is out of bounds" do + lambda { @canvas.row(-1) }.should raise_error(ChunkyPNG::OutOfBounds) + lambda { @canvas.row(16) }.should raise_error(ChunkyPNG::OutOfBounds) + end + + it "should return the correct pixels" do + data = @canvas.row(0) + data.should have(@canvas.width).items + data.should == [65535, 268500991, 536936447, 805371903, 1073807359, 1342242815, 1610678271, 1879113727, 2147549183, 2415984639, 2684420095, 2952855551, 3221291007, 3489726463, 3758161919, 4026597375] + end + end + + describe '#column' do + before { @canvas = reference_canvas('operations') } + + it "should give an out of bounds exception when x-coordinate is out of bounds" do + lambda { @canvas.column(-1) }.should raise_error(ChunkyPNG::OutOfBounds) + lambda { @canvas.column(16) }.should raise_error(ChunkyPNG::OutOfBounds) + end + + it "should return the correct pixels" do + data = @canvas.column(0) + data.should have(@canvas.height).items + data.should == [65535, 1114111, 2162687, 3211263, 4259839, 5308415, 6356991, 7405567, 8454143, 9502719, 10551295, 11599871, 12648447, 13697023, 14745599, 15794175] + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/color_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/color_spec.rb new file mode 100644 index 00000000..1c467a4a --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/color_spec.rb @@ -0,0 +1,144 @@ +require 'spec_helper' + +describe ChunkyPNG::Color do + include ChunkyPNG::Color + + before(:each) do + @white = 0xffffffff + @black = 0x000000ff + @opaque = 0x0a6496ff + @non_opaque = 0x0a649664 + @fully_transparent = 0x0a649600 + end + + describe '#pixel_bytesize' do + it "should return the normal amount of bytes with a bit depth of 8" do + pixel_bytesize(ChunkyPNG::COLOR_TRUECOLOR, 8).should == 3 + end + + it "should return a multiple of the normal amount of bytes with a bit depth greater than 8" do + pixel_bytesize(ChunkyPNG::COLOR_TRUECOLOR, 16).should == 6 + pixel_bytesize(ChunkyPNG::COLOR_TRUECOLOR_ALPHA, 16).should == 8 + pixel_bytesize(ChunkyPNG::COLOR_GRAYSCALE_ALPHA, 16).should == 4 + end + + it "should return 1 with a bit depth lower than 0" do + pixel_bytesize(ChunkyPNG::COLOR_TRUECOLOR, 4).should == 1 + pixel_bytesize(ChunkyPNG::COLOR_INDEXED, 2).should == 1 + pixel_bytesize(ChunkyPNG::COLOR_GRAYSCALE_ALPHA, 1).should == 1 + end + end + + describe '#pass_bytesize' do + it "should calculate a pass size correctly" do + pass_bytesize(ChunkyPNG::COLOR_TRUECOLOR, 8, 10, 10).should == 310 + end + + it "should return 0 if one of the dimensions is zero" do + pass_bytesize(ChunkyPNG::COLOR_TRUECOLOR, 8, 0, 10).should == 0 + pass_bytesize(ChunkyPNG::COLOR_TRUECOLOR, 8, 10, 0).should == 0 + end + end + + describe '#rgba' do + it "should represent pixels as the correct number" do + rgba(255, 255, 255, 255).should == @white + rgba( 0, 0, 0, 255).should == @black + rgba( 10, 100, 150, 255).should == @opaque + rgba( 10, 100, 150, 100).should == @non_opaque + rgba( 10, 100, 150, 0).should == @fully_transparent + end + end + + describe '#from_hex' do + it "should load colors correctlt from hex notation" do + from_hex('0a649664').should == @non_opaque + from_hex('#0a649664').should == @non_opaque + from_hex('0x0a649664').should == @non_opaque + from_hex('0a6496').should == @opaque + from_hex('#0a6496').should == @opaque + from_hex('0x0a6496').should == @opaque + end + end + + describe '#opaque?' do + it "should correctly check for opaqueness" do + opaque?(@white).should be_true + opaque?(@black).should be_true + opaque?(@opaque).should be_true + opaque?(@non_opaque).should be_false + opaque?(@fully_transparent).should be_false + end + end + + describe 'extractiion of separate color channels' do + it "should extract components from a color correctly" do + r(@opaque).should == 10 + g(@opaque).should == 100 + b(@opaque).should == 150 + a(@opaque).should == 255 + end + end + + describe '#to_hex' do + it "should represent colors correcly using hex notation" do + to_hex(@white).should == '#ffffffff' + to_hex(@black).should == '#000000ff' + to_hex(@opaque).should == '#0a6496ff' + to_hex(@non_opaque).should == '#0a649664' + to_hex(@fully_transparent).should == '#0a649600' + end + + it "should represent colors correcly using hex notation without alpha channel" do + to_hex(@white, false).should == '#ffffff' + to_hex(@black, false).should == '#000000' + to_hex(@opaque, false).should == '#0a6496' + to_hex(@non_opaque, false).should == '#0a6496' + to_hex(@fully_transparent, false).should == '#0a6496' + end + end + + describe 'conversion to other formats' do + it "should convert the individual color values back correctly" do + to_truecolor_bytes(@opaque).should == [10, 100, 150] + to_truecolor_alpha_bytes(@non_opaque).should == [10, 100, 150, 100] + end + end + + describe '#compose' do + + it "should use the foregorund color as is when the background color is fully transparent" do + compose(@non_opaque, @fully_transparent).should == @non_opaque + end + + it "should use the foregorund color as is when an opaque color is given as foreground color" do + compose(@opaque, @white).should == @opaque + end + + it "should use the background color as is when a fully transparent pixel is given as foreground color" do + compose(@fully_transparent, @white).should == @white + end + + it "should compose pixels correctly with both algorithms" do + compose_quick(@non_opaque, @white).should == 0x9fc2d6ff + compose_precise(@non_opaque, @white).should == 0x9fc2d6ff + end + end + + describe '#decompose_alpha' do + it "should decompose the alpha channel correctly" do + decompose_alpha(0x9fc2d6ff, @opaque, @white).should == 0x00000064 + end + end + + describe '#blend' do + it "should blend colors correctly" do + blend(@opaque, @black).should == 0x05324bff + end + + it "should not matter what color is used as foreground, and what as background" do + blend(@opaque, @black).should == blend(@black, @opaque) + end + end +end + diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/datastream_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/datastream_spec.rb new file mode 100644 index 00000000..7104e33e --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/datastream_spec.rb @@ -0,0 +1,32 @@ +require 'spec_helper' + +describe ChunkyPNG::Datastream do + + describe '.from_io'do + it "should raise an error when loading a file with a bad signature" do + filename = resource_file('damaged_signature.png') + lambda { ChunkyPNG::Datastream.from_file(filename) }.should raise_error + end + + it "should raise an error if the CRC of a chunk is incorrect" do + filename = resource_file('damaged_chunk.png') + lambda { ChunkyPNG::Datastream.from_file(filename) }.should raise_error + end + end + + describe '#metadata' do + it "should load uncompressed tXTt chunks correctly" do + filename = resource_file('text_chunk.png') + ds = ChunkyPNG::Datastream.from_file(filename) + ds.metadata['Title'].should == 'My amazing icon!' + ds.metadata['Author'].should == "Willem van Bergen" + end + + it "should load compressed zTXt chunks correctly" do + filename = resource_file('ztxt_chunk.png') + ds = ChunkyPNG::Datastream.from_file(filename) + ds.metadata['Title'].should == 'PngSuite' + ds.metadata['Copyright'].should == "Copyright Willem van Schaik, Singapore 1995-96" + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/image_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/image_spec.rb new file mode 100644 index 00000000..b34aa296 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/image_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +describe ChunkyPNG::Image do + describe '#metadata' do + + it "should load metadata from an existing file" do + image = ChunkyPNG::Image.from_file(resource_file('text_chunk.png')) + image.metadata['Title'].should == 'My amazing icon!' + image.metadata['Author'].should == 'Willem van Bergen' + end + + it "should write metadata to the file correctly" do + filename = resource_file('_metadata.png') + + image = ChunkyPNG::Image.new(10, 10) + image.metadata['Title'] = 'My amazing icon!' + image.metadata['Author'] = 'Willem van Bergen' + image.save(filename) + + metadata = ChunkyPNG::Datastream.from_file(filename).metadata + metadata['Title'].should == 'My amazing icon!' + metadata['Author'].should == 'Willem van Bergen' + end + end +end \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/rmagick_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/rmagick_spec.rb new file mode 100644 index 00000000..d039ab40 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png/rmagick_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +begin + require 'chunky_png/rmagick' + + describe ChunkyPNG::RMagick do + + it "should import an image from RMagick correctly" do + image = Magick::Image.read(resource_file('composited.png')).first + canvas = ChunkyPNG::RMagick.import(image) + canvas.should == reference_canvas('composited') + end + + it "should export an image to RMagick correctly" do + canvas = reference_canvas('composited') + image = ChunkyPNG::RMagick.export(canvas) + image.format = 'PNG32' + canvas.should == ChunkyPNG::Canvas.from_blob(image.to_blob) + end + end +rescue LoadError => e + # skipping RMagick tests +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png_spec.rb new file mode 100644 index 00000000..80a6e487 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/chunky_png_spec.rb @@ -0,0 +1,37 @@ +require 'spec_helper' + +describe ChunkyPNG do + + # it "should create reference images for all color modes" do + # image = ChunkyPNG::Image.new(10, 10, ChunkyPNG::Color.rgb(100, 100, 100)) + # [:indexed, :grayscale, :grayscale_alpha, :truecolor, :truecolor_alpha].each do |color_mode| + # + # color_mode_id = ChunkyPNG.const_get("COLOR_#{color_mode.to_s.upcase}") + # filename = resource_file("gray_10x10_#{color_mode}.png") + # image.save(filename, :color_mode => color_mode_id) + # end + # end + + # it "should create a reference image for operations" do + # image = ChunkyPNG::Image.new(16, 16, ChunkyPNG::Color::WHITE) + # r = 0 + # image.width.times do |x| + # g = 0 + # image.height.times do |y| + # image[x, y] = ChunkyPNG::Color.rgb(r, g, 255) + # g += 16 + # end + # r += 16 + # end + # filename = resource_file('operations.png') + # image.save(filename) + # # `open #{filename}` + # end + + # it "should create damaged CRC values" do + # Zlib.stub!(:crc32).and_return(12345) + # image = ChunkyPNG::Image.new(10, 10, ChunkyPNG::Color::BLACK) + # image.save(resource_file('damaged_chunk.png')) + # end +end + diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgai4a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgai4a08.png new file mode 100644 index 00000000..398132be Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgai4a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgai4a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgai4a16.png new file mode 100644 index 00000000..51192e73 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgai4a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgan6a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgan6a08.png new file mode 100644 index 00000000..e6087387 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgan6a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgan6a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgan6a16.png new file mode 100644 index 00000000..984a9952 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgan6a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgbn4a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgbn4a08.png new file mode 100644 index 00000000..7cbefc3b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgbn4a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bggn4a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bggn4a16.png new file mode 100644 index 00000000..13fd85ba Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bggn4a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgwn6a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgwn6a08.png new file mode 100644 index 00000000..a67ff205 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgwn6a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgyn6a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgyn6a16.png new file mode 100644 index 00000000..ae3e9be5 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/background_chunks/bgyn6a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g01.png new file mode 100644 index 00000000..556fa727 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g01.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g01.rgba new file mode 100644 index 00000000..6a932558 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g01.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g02.png new file mode 100644 index 00000000..ce09821e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g02.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g02.rgba new file mode 100644 index 00000000..86b1485b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g02.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g04.png new file mode 100644 index 00000000..3853273f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g04.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g04.rgba new file mode 100644 index 00000000..68c23404 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g04.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g08.png new file mode 100644 index 00000000..faed8bec Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g08.rgba new file mode 100644 index 00000000..391a129e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g16.png new file mode 100644 index 00000000..a9f28165 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g16.rgba new file mode 100644 index 00000000..22271a8b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi0g16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c08.png new file mode 100644 index 00000000..2aab44d4 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c08.rgba new file mode 100644 index 00000000..877ead96 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c16.png new file mode 100644 index 00000000..cd7e50f9 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c16.rgba new file mode 100644 index 00000000..45b1277b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi2c16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p01.png new file mode 100644 index 00000000..00a7cea6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p01.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p01.rgba new file mode 100644 index 00000000..5c0721d2 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p01.rgba @@ -0,0 +1 @@ +îÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p02.png new file mode 100644 index 00000000..bb16b44b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p02.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p02.rgba new file mode 100644 index 00000000..67839c3e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p02.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p04.png new file mode 100644 index 00000000..b4e888e2 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p04.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p04.rgba new file mode 100644 index 00000000..ec333980 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p04.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p08.png new file mode 100644 index 00000000..50a6d1ca Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p08.rgba new file mode 100644 index 00000000..7e0e15ba Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi3p08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a08.png new file mode 100644 index 00000000..398132be Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a08.rgba new file mode 100644 index 00000000..1946bed1 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a16.png new file mode 100644 index 00000000..51192e73 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a16.rgba new file mode 100644 index 00000000..a2d6f3d9 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi4a16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a08.png new file mode 100644 index 00000000..aecb32e0 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a08.rgba new file mode 100644 index 00000000..acac3d35 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a16.png new file mode 100644 index 00000000..4181533a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a16.rgba new file mode 100644 index 00000000..4e114c9a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basi6a16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g01.png new file mode 100644 index 00000000..1d722423 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g01.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g01.rgba new file mode 100644 index 00000000..6a932558 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g01.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g02.png new file mode 100644 index 00000000..50833241 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g02.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g02.rgba new file mode 100644 index 00000000..86b1485b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g02.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g04.png new file mode 100644 index 00000000..0bf36878 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g04.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g04.rgba new file mode 100644 index 00000000..68c23404 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g04.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g08.png new file mode 100644 index 00000000..23c82379 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g08.rgba new file mode 100644 index 00000000..391a129e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g16.png new file mode 100644 index 00000000..e7c82f78 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g16.rgba new file mode 100644 index 00000000..22271a8b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn0g16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c08.png new file mode 100644 index 00000000..db5ad158 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c08.rgba new file mode 100644 index 00000000..877ead96 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c16.png new file mode 100644 index 00000000..50c1cb91 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c16.rgba new file mode 100644 index 00000000..45b1277b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn2c16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p01.png new file mode 100644 index 00000000..b145c2b8 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p01.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p01.rgba new file mode 100644 index 00000000..5c0721d2 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p01.rgba @@ -0,0 +1 @@ +îÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ"fÿÿ"fÿÿ"fÿÿ"fÿÿîÿ"ÿîÿ"ÿîÿ"ÿîÿ"ÿ \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p02.png new file mode 100644 index 00000000..8985b3d8 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p02.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p02.rgba new file mode 100644 index 00000000..67839c3e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p02.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p04.png new file mode 100644 index 00000000..0fbf9e82 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p04.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p04.rgba new file mode 100644 index 00000000..ec333980 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p04.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p08.png new file mode 100644 index 00000000..0ddad07e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p08.rgba new file mode 100644 index 00000000..7e0e15ba Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn3p08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a08.png new file mode 100644 index 00000000..3e130522 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a08.rgba new file mode 100644 index 00000000..1946bed1 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a16.png new file mode 100644 index 00000000..8243644d Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a16.rgba new file mode 100644 index 00000000..a2d6f3d9 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn4a16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a08.png new file mode 100644 index 00000000..e6087387 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a08.rgba new file mode 100644 index 00000000..acac3d35 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a16.png new file mode 100644 index 00000000..984a9952 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a16.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a16.rgba new file mode 100644 index 00000000..4e114c9a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/basic/basn6a16.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/x00n0g01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/x00n0g01.png new file mode 100644 index 00000000..db3a5fda Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/x00n0g01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/xcrn0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/xcrn0g04.png new file mode 100644 index 00000000..5bce9f3a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/xcrn0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/xlfn0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/xlfn0g04.png new file mode 100644 index 00000000..1fd104ba --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/broken/xlfn0g04.png @@ -0,0 +1,13 @@ +‰PNG + + + + + +IHDR “áÈ)ÈIDATxœ]ÑÁ +Â0 P*@ð¡#° + +#TâÈ10lPF`Ø F=•ŸÄIQâ*çÅuí”`%qk +Hžñšˆ©ñ´€m÷Íüµàߟ Ñ=,¸fìOK + +ç ÐtŽÀ(Èïä’צíF ;èPº€¯¾{xpç]9‡/p*$(ì*éyìÕƒ ×þÚéçè@÷C¼  cÔqž‹NÛU#„)11·.räðfä0°ägh(¥týÙÂEøÿ‰kIEND®B`‚ \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi1n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi1n0g16.png new file mode 100644 index 00000000..e7c82f78 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi1n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi1n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi1n2c16.png new file mode 100644 index 00000000..50c1cb91 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi1n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi2n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi2n0g16.png new file mode 100644 index 00000000..14d64c58 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi2n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi2n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi2n2c16.png new file mode 100644 index 00000000..4c2e3e33 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi2n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi4n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi4n0g16.png new file mode 100644 index 00000000..69e73ede Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi4n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi4n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi4n2c16.png new file mode 100644 index 00000000..93691e37 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi4n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi9n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi9n0g16.png new file mode 100644 index 00000000..92484135 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi9n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi9n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi9n2c16.png new file mode 100644 index 00000000..f0512e49 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/chunk_ordering/oi9n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z00n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z00n2c08.png new file mode 100644 index 00000000..7669eb83 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z00n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z03n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z03n2c08.png new file mode 100644 index 00000000..bfb10de8 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z03n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z06n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z06n2c08.png new file mode 100644 index 00000000..b90ebc10 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z06n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z09n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z09n2c08.png new file mode 100644 index 00000000..5f191a78 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/compression_levels/z09n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08.png new file mode 100644 index 00000000..45a00759 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08.rgba new file mode 100644 index 00000000..6427b7c2 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08_reference.png new file mode 100644 index 00000000..34a9ff45 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08_reference.rgba new file mode 100644 index 00000000..6427b7c2 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n0g08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08.png new file mode 100644 index 00000000..d6a1ffff Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08.rgba new file mode 100644 index 00000000..3cb35479 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08_reference.png new file mode 100644 index 00000000..c72d87c1 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08_reference.rgba new file mode 100644 index 00000000..3cb35479 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f00n2c08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08.png new file mode 100644 index 00000000..4a1107b4 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08.rgba new file mode 100644 index 00000000..71ffc091 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08_reference.png new file mode 100644 index 00000000..f5595f0c Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08_reference.rgba new file mode 100644 index 00000000..71ffc091 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n0g08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08.png new file mode 100644 index 00000000..26fee958 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08.rgba new file mode 100644 index 00000000..bd4776b3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08_reference.png new file mode 100644 index 00000000..a8fcdab7 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08_reference.rgba new file mode 100644 index 00000000..bd4776b3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f01n2c08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08.png new file mode 100644 index 00000000..bfe410c5 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08.rgba new file mode 100644 index 00000000..857e69d2 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08_reference.png new file mode 100644 index 00000000..44877cb7 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08_reference.rgba new file mode 100644 index 00000000..857e69d2 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n0g08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08.png new file mode 100644 index 00000000..e590f123 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08.rgba new file mode 100644 index 00000000..56b7d61f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08_reference.png new file mode 100644 index 00000000..09f22e5d Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08_reference.rgba new file mode 100644 index 00000000..56b7d61f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f02n2c08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08.png new file mode 100644 index 00000000..ed01e292 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08.rgba new file mode 100644 index 00000000..f59ea792 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08_reference.png new file mode 100644 index 00000000..6d197230 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08_reference.rgba new file mode 100644 index 00000000..f59ea792 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n0g08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08.png new file mode 100644 index 00000000..75811505 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08.rgba new file mode 100644 index 00000000..fcb5088a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08_reference.png new file mode 100644 index 00000000..36829ce9 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08_reference.rgba new file mode 100644 index 00000000..fcb5088a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f03n2c08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08.png new file mode 100644 index 00000000..663fdae3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08.rgba new file mode 100644 index 00000000..79535b09 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08_reference.png new file mode 100644 index 00000000..b5e52b69 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08_reference.rgba new file mode 100644 index 00000000..79535b09 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n0g08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08.png new file mode 100644 index 00000000..3c8b5116 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08.rgba new file mode 100644 index 00000000..3653c27b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08_reference.png new file mode 100644 index 00000000..8b2e6068 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08_reference.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08_reference.rgba new file mode 100644 index 00000000..3653c27b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/filtering/f04n2c08_reference.rgba differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n0g16.png new file mode 100644 index 00000000..41083ca8 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n2c08.png new file mode 100644 index 00000000..a9354dbe Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n3p04.png new file mode 100644 index 00000000..60396c95 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g03n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n0g16.png new file mode 100644 index 00000000..32395b76 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n2c08.png new file mode 100644 index 00000000..a652b0ce Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n3p04.png new file mode 100644 index 00000000..5661cc31 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g04n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n0g16.png new file mode 100644 index 00000000..70b37f01 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n2c08.png new file mode 100644 index 00000000..932c1365 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n3p04.png new file mode 100644 index 00000000..96199305 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g05n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n0g16.png new file mode 100644 index 00000000..d6a47c2d Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n2c08.png new file mode 100644 index 00000000..59734646 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n3p04.png new file mode 100644 index 00000000..c73fb613 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g07n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n0g16.png new file mode 100644 index 00000000..85f2c958 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n2c08.png new file mode 100644 index 00000000..b3039970 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n3p04.png new file mode 100644 index 00000000..1b6a6be2 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g10n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n0g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n0g16.png new file mode 100644 index 00000000..a9f6787c Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n0g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n2c08.png new file mode 100644 index 00000000..03f505a6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n3p04.png new file mode 100644 index 00000000..4f943c61 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/gamma/g25n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm0n0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm0n0g04.png new file mode 100644 index 00000000..9fba5db3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm0n0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm7n0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm7n0g04.png new file mode 100644 index 00000000..f7dc46e6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm7n0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm9n0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm9n0g04.png new file mode 100644 index 00000000..dd70911a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/metadata/cm9n0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ccwn2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ccwn2c08.png new file mode 100644 index 00000000..47c24817 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ccwn2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ccwn3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ccwn3p08.png new file mode 100644 index 00000000..8bb2c109 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ccwn3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdfn2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdfn2c08.png new file mode 100644 index 00000000..559e5261 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdfn2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdhn2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdhn2c08.png new file mode 100644 index 00000000..3e07e8ec Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdhn2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdsn2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdsn2c08.png new file mode 100644 index 00000000..076c32cc Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdsn2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdun2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdun2c08.png new file mode 100644 index 00000000..846033be Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cdun2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ch1n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ch1n3p04.png new file mode 100644 index 00000000..17cd12df Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ch1n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ch2n3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ch2n3p08.png new file mode 100644 index 00000000..25c17987 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ch2n3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs3n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs3n2c16.png new file mode 100644 index 00000000..bf5fd20a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs3n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs3n3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs3n3p08.png new file mode 100644 index 00000000..f4a66237 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs3n3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs5n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs5n2c08.png new file mode 100644 index 00000000..40f947c3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs5n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs5n3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs5n3p08.png new file mode 100644 index 00000000..dfd6e6e6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs5n3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs8n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs8n2c08.png new file mode 100644 index 00000000..8e01d329 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs8n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs8n3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs8n3p08.png new file mode 100644 index 00000000..a44066eb Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/cs8n3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ct0n0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ct0n0g04.png new file mode 100644 index 00000000..40d1e062 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ct0n0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ct1n0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ct1n0g04.png new file mode 100644 index 00000000..3ba110aa Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ct1n0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ctzn0g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ctzn0g04.png new file mode 100644 index 00000000..b4401c9c Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ctzn0g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/pp0n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/pp0n2c16.png new file mode 100644 index 00000000..8f2aad73 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/pp0n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/pp0n6a08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/pp0n6a08.png new file mode 100644 index 00000000..4ed7a30e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/pp0n6a08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps1n0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps1n0g08.png new file mode 100644 index 00000000..2053df2b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps1n0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps1n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps1n2c16.png new file mode 100644 index 00000000..b03ecfc6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps1n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps2n0g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps2n0g08.png new file mode 100644 index 00000000..beeab8ff Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps2n0g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps2n2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps2n2c16.png new file mode 100644 index 00000000..c256f909 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/other/ps2n2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s01i3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s01i3p01.png new file mode 100644 index 00000000..6c0fad1f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s01i3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s01n3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s01n3p01.png new file mode 100644 index 00000000..cb2c8c78 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s01n3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s02i3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s02i3p01.png new file mode 100644 index 00000000..2defaed9 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s02i3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s02n3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s02n3p01.png new file mode 100644 index 00000000..2b1b6696 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s02n3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s03i3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s03i3p01.png new file mode 100644 index 00000000..c23fdc46 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s03i3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s03n3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s03n3p01.png new file mode 100644 index 00000000..6d96ee4f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s03n3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s04i3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s04i3p01.png new file mode 100644 index 00000000..0e710c2c Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s04i3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s04n3p01.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s04n3p01.png new file mode 100644 index 00000000..956396c4 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s04n3p01.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s05i3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s05i3p02.png new file mode 100644 index 00000000..d14cbd35 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s05i3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s05n3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s05n3p02.png new file mode 100644 index 00000000..bf940f05 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s05n3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s06i3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s06i3p02.png new file mode 100644 index 00000000..456ada32 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s06i3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s06n3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s06n3p02.png new file mode 100644 index 00000000..501064dc Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s06n3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s07i3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s07i3p02.png new file mode 100644 index 00000000..44b66bab Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s07i3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s07n3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s07n3p02.png new file mode 100644 index 00000000..6a582593 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s07n3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s08i3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s08i3p02.png new file mode 100644 index 00000000..acf74f3f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s08i3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s08n3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s08n3p02.png new file mode 100644 index 00000000..b7094e1b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s08n3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s09i3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s09i3p02.png new file mode 100644 index 00000000..0bfae8e4 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s09i3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s09n3p02.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s09n3p02.png new file mode 100644 index 00000000..711ab824 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s09n3p02.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s32i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s32i3p04.png new file mode 100644 index 00000000..0841910b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s32i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s32n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s32n3p04.png new file mode 100644 index 00000000..fa58e3e3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s32n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s33i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s33i3p04.png new file mode 100644 index 00000000..ab0dc14a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s33i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s33n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s33n3p04.png new file mode 100644 index 00000000..764f1a3d Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s33n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s34i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s34i3p04.png new file mode 100644 index 00000000..bd99039b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s34i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s34n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s34n3p04.png new file mode 100644 index 00000000..9cbc68b3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s34n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s35i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s35i3p04.png new file mode 100644 index 00000000..e2a5e0a6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s35i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s35n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s35n3p04.png new file mode 100644 index 00000000..90b892eb Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s35n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s36i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s36i3p04.png new file mode 100644 index 00000000..eb61b6f9 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s36i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s36n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s36n3p04.png new file mode 100644 index 00000000..b38d1797 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s36n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s37i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s37i3p04.png new file mode 100644 index 00000000..6e2b1e9b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s37i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s37n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s37n3p04.png new file mode 100644 index 00000000..4d3054da Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s37n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s38i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s38i3p04.png new file mode 100644 index 00000000..a0a8a140 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s38i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s38n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s38n3p04.png new file mode 100644 index 00000000..1233ed04 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s38n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s39i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s39i3p04.png new file mode 100644 index 00000000..04fee93e Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s39i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s39n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s39n3p04.png new file mode 100644 index 00000000..c750100d Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s39n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s40i3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s40i3p04.png new file mode 100644 index 00000000..68f358b8 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s40i3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s40n3p04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s40n3p04.png new file mode 100644 index 00000000..864b6b96 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/sizes/s40n3p04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn1g04.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn1g04.png new file mode 100644 index 00000000..fc800205 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn1g04.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn2c16.png new file mode 100644 index 00000000..5abfbbb3 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn3p08.png new file mode 100644 index 00000000..4210d168 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbbn3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbgn2c16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbgn2c16.png new file mode 100644 index 00000000..236c81dc Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbgn2c16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbgn3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbgn3p08.png new file mode 100644 index 00000000..42db2325 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbgn3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbrn2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbrn2c08.png new file mode 100644 index 00000000..8c214746 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbrn2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbwn1g16.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbwn1g16.png new file mode 100644 index 00000000..dba2cbb6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbwn1g16.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbwn3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbwn3p08.png new file mode 100644 index 00000000..7922135a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbwn3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbyn3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbyn3p08.png new file mode 100644 index 00000000..5b2c6cbb Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tbyn3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n1g08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n1g08.png new file mode 100644 index 00000000..caad31de Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n1g08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n2c08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n2c08.png new file mode 100644 index 00000000..f26be446 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n2c08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n3p08.png new file mode 100644 index 00000000..4d6cf9e4 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp0n3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp1n3p08.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp1n3p08.png new file mode 100644 index 00000000..6c5fd6ec Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite/transparency/tp1n3p08.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite_spec.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite_spec.rb new file mode 100644 index 00000000..81c71192 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/png_suite_spec.rb @@ -0,0 +1,119 @@ +require 'spec_helper' + +describe 'PNG testuite' do + + context 'Decoding broken images' do + png_suite_files(:broken).each do |file| + it "should report #{File.basename(file)} as broken" do + lambda { ChunkyPNG::Image.from_file(file) }.should raise_error(ChunkyPNG::Exception) + end + + it "should not report #{File.basename(file)} as unsupported" do + lambda { ChunkyPNG::Image.from_file(file) }.should_not raise_error(ChunkyPNG::NotSupported) + end + end + end + + context 'Decoding unsupported images' do + + # TODO: we eventually want to support these! + + png_suite_files(:basic_not_supported).each do |file| + color_mode = file.match(/[in](\d)[apgc](\d\d)\.png$/)[1].to_i + bit_depth = file.match(/[in](\d)[apgc](\d\d)\.png$/)[2].to_i + + it "should report #{File.basename(file)} (color mode: #{color_mode}, bit depth: #{bit_depth}) as unsupported" do + lambda { ChunkyPNG::Image.from_file(file) }.should raise_error(ChunkyPNG::NotSupported) + end + end + end + + context 'Decoding supported images' do + png_suite_files(:basic, '*.png').each do |file| + + reference = file.sub(/\.png$/, '.rgba') + color_mode = file.match(/[in](\d)[apgc](\d\d)\.png$/)[1].to_i + bit_depth = file.match(/[in](\d)[apgc](\d\d)\.png$/)[2].to_i + + it "should decode #{File.basename(file)} (color mode: #{color_mode}, bit depth: #{bit_depth}) exactly the same as the reference image" do + decoded = ChunkyPNG::Canvas.from_file(file) + File.open(reference, 'rb') { |f| decoded.to_rgba_stream.should == f.read } + end + end + end + + context 'Decoding text chunks' do + + it "should not find metadata in a file without text chunks" do + image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, 'cm0n0g04.png')) + image.metadata.should be_empty + end + + # it "should find metadata in a file with uncompressed text chunks" do + # image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, 'cm7n0g04.png')) + # image.metadata.should_not be_empty + # end + # + # it "should find metadata in a file with compressed text chunks" do + # image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, 'cm9n0g04.png')) + # image.metadata.should_not be_empty + # end + end + + context 'Decoding filter methods' do + png_suite_files(:filtering, '*_reference.png').each do |reference_file| + + file = reference_file.sub(/_reference\.png$/, '.png') + filter_method = file.match(/f(\d\d)[a-z0-9]+\.png/)[1].to_i + + it "should decode #{File.basename(file)} (filter method: #{filter_method}) exactly the same as the reference image" do + decoded = ChunkyPNG::Canvas.from_file(file) + reference = ChunkyPNG::Canvas.from_file(reference_file) + decoded.should == reference + end + end + end + + context 'Decoding different chunk splits' do + it "should decode grayscale images successfully regardless of the data chunk ordering and splitting" do + reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi1n0g16.png')).imagedata + ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi2n0g16.png')).imagedata.should == reference + ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi4n0g16.png')).imagedata.should == reference + ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi9n0g16.png')).imagedata.should == reference + end + + it "should decode color images successfully regardless of the data chunk ordering and splitting" do + reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi1n2c16.png')).imagedata + ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi2n2c16.png')).imagedata.should == reference + ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi4n2c16.png')).imagedata.should == reference + ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi9n2c16.png')).imagedata.should == reference + end + end + + context 'Decoding different compression levels' do + it "should decode the image successfully regardless of the compression level" do + reference = ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z00n2c08.png')).imagedata + ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z03n2c08.png')).imagedata.should == reference + ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z06n2c08.png')).imagedata.should == reference + ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z09n2c08.png')).imagedata.should == reference + end + end + + context 'Decoding different sizes' do + + png_suite_files(:sizes, '*n*.png').each do |file| + dimension = file.match(/s(\d\d)n\dp\d\d/)[1].to_i + + it "should create a canvas with a #{dimension}x#{dimension} size" do + canvas = ChunkyPNG::Image.from_file(file) + canvas.width.should == dimension + canvas.height.should == dimension + end + + it "should decode the #{dimension}x#{dimension} interlaced image exactly the same the non-interlaced version" do + interlaced_file = file.sub(/n3p(\d\d)\.png$/, 'i3p\\1.png') + ChunkyPNG::Image.from_file(interlaced_file).should == ChunkyPNG::Image.from_file(file) + end + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/adam7.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/adam7.png new file mode 100644 index 00000000..3bab12c5 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/adam7.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock.png new file mode 100644 index 00000000..c37e23a6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_base.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_base.png new file mode 100644 index 00000000..39949f3f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_base.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_flip_horizontally.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_flip_horizontally.png new file mode 100644 index 00000000..cde88849 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_flip_horizontally.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_flip_vertically.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_flip_vertically.png new file mode 100644 index 00000000..437e594b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_flip_vertically.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_mask.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_mask.png new file mode 100644 index 00000000..480d512b Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_mask.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_mask_updated.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_mask_updated.png new file mode 100644 index 00000000..108646f6 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_mask_updated.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_180.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_180.png new file mode 100644 index 00000000..1eaaa7c0 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_180.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_left.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_left.png new file mode 100644 index 00000000..48ee2b8a Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_left.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_right.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_right.png new file mode 100644 index 00000000..04475233 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_rotate_right.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_stubbed.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_stubbed.png new file mode 100644 index 00000000..e254c79d Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_stubbed.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_updated.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_updated.png new file mode 100644 index 00000000..a05406ca Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/clock_updated.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/composited.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/composited.png new file mode 100644 index 00000000..3c79532c Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/composited.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/cropped.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/cropped.png new file mode 100644 index 00000000..9b9299b0 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/cropped.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/damaged_chunk.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/damaged_chunk.png new file mode 100644 index 00000000..cf1fbcb7 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/damaged_chunk.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/damaged_signature.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/damaged_signature.png new file mode 100644 index 00000000..1fd104ba --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/damaged_signature.png @@ -0,0 +1,13 @@ +‰PNG + + + + + +IHDR “áÈ)ÈIDATxœ]ÑÁ +Â0 P*@ð¡#° + +#TâÈ10lPF`Ø F=•ŸÄIQâ*çÅuí”`%qk +Hžñšˆ©ñ´€m÷Íüµàߟ Ñ=,¸fìOK + +ç ÐtŽÀ(Èïä’צíF ;èPº€¯¾{xpç]9‡/p*$(ì*éyìÕƒ ×þÚéçè@÷C¼  cÔqž‹NÛU#„)11·.räðfä0°ägh(¥týÙÂEøÿ‰kIEND®B`‚ \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/lines.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/lines.png new file mode 100644 index 00000000..f3543851 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/lines.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/operations.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/operations.png new file mode 100644 index 00000000..fe820f95 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/operations.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream.rgb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream.rgb new file mode 100644 index 00000000..b4183a37 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream.rgb @@ -0,0 +1,67 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýûûûúúúøøø÷÷÷öööõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõ÷÷÷øøøùùùúúúûûûýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýúúú÷÷÷ôôôðððìììéééæææåååååååååååååååååååååååååååååååååääääääääääääääääääääääääääääääääääääåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååèèèëëëïïïòòòõõõùùùüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûöööñññëëëåååßßßÚÚÚÕÕÕÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÏÏÏÎÎÎÎÎÎÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÐÐÐÏÏÏÏÏÏÎÎÎÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔØØØÝÝÝãããèèèîîîôôôúúúþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþúúúòòòêêêÈÈȦ¦¦   œœœ–––•••••••••••••••“““’’’’’’‘‘‘ŽŽŽŒŒŒ‹‹‹ŠŠŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŽŽŽ’’’“““”””•••–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––————————————–––•••””””””“““’’’’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’’“““””””””•••–––———————————————––––––—————————————————————––––––••••••””””””””””””””””””••••••––––––——————————————————————————————––––––––––––•••••••••••••••••••••••••••••••••••••••••••••••••••––––––––––––—————————————————————•••”””’’’‘‘‘ŽŽŽŒŒŒ‹‹‹ŒŒŒ’’’”””•••–––————————————————————————–––––––––™™™ŸŸŸ¤¤¤ÓÓÓçççïïï÷÷÷ýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþøøøîîîäääooo£££àààêêêõõõýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþöööêêêÞÞÞkkkžžžÚÚÚåååòòòüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýôôôæææØØØggg'%# #" $" (&$*'%*(&+(&,)'*(')'% &$#(%#*'%+(&+(&,)' //////........./// +(&+)')'&)&%)&$'$"&#!$" %"!#!#! # $" %"!&$"(%#)'%*(&,)(-*(-*(-*(-+)-+).+),*(*)'*(&$" (&$(&$*(&+)&-*(-+),*(-+)-*(,*(+(&)&%'&$'$#(&$*(&+(&,)'-+)-+).+)-*(,)',)',*(+(')'%'%# ™™™ÓÓÓàààïïïûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýóóóâââÓÓÓdddJA:nM3ÿÿÿþþþúúúõõõñññìììæææàààÚÚÚÔÔÔÎÎΣ££VVV ¸¸¸ÖÖÖÜÜÜãããéééT6Z:!0jG,qM0[=|U6d<f?!`;8)08)08)08*18*18*18*18*18*18*18*18*18*18*1=/5mK1wT8uQ4xR4†`AqJ+///™™™™™™˜˜˜–––™™™™™™,)'pH)|U8Z~V5‡_>tK+mD$nE%X8ƒ[;tL-a:3! nK0jF)hC%sK-‚Z:‰`@X8h?pG'kD#nG(qL/uR7ÿÿÿÿÿÿýýýûûûùùùöööôôôV4]:`;pI*xO/‡^>gGZ9|T4„]>oH)qK,kE)uR6mJ/%#!”””ÍÍÍÜÜÜîîîûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýòòòàààÐÐÐcccH>7iG.ÿÿÿýýýøøøóóóíííçççàààÚÚÚ’’’ZZZ%%%''' ¹¹¹ÙÙÙàààèèèbF-\<#1 fC(‚^AhI’iIŽeE|T5wS55'.5'.5'.5'.5'.5'.5'.5'.6(/6(/6(/6(/6(/6(/:-3jI/vR7wR5zT6uM.mD$000ŸŸŸŸŸŸœœœ›››žžžŸŸŸ.+)tL,~W8zT7\@WC3T8#ÿÿÿÿÿÿýýýûûûùùùöööôôôgD(sN2{U6‚Y8~T2…[9|R0…[9cA˜mL˜nL’iIsL-;( +mJ/iE(qJ-yQ1–kK£xV—mKcA†[:…[:tL,oI,uR6ÿÿÿÿÿÿýýýûûûùùùöööôôôtS9qL0{U7sJ+uJ(Œa?gE‰_>…\…]=ŽdB{R1   «««¨¨¨§§§©©©«««2/-†\9ˆ^<‹cBS;( ÿÿÿÿÿÿýýýûûûùùùöööôôôrN1xQ3ŒcC•jHšmI˜jFa=‹]8‰[6ƒU0ƒU1†Z8uL+3  oK/vO1‚Y8~S1‡Z6Œ]9‰[6S.}N*Š]:Œa?€W8|W:ÿÿÿÿÿÿýýýûûûùùùöööôôô`>"fA#sK*Š_<Ža=™kF™lH•iGŠ`>ˆ_>zQ1"'c@%cA'$#!‘‘‘ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐÐdddE<5a="þþþûûûõõõîîîæææßßßlll 444<<lB Š]8†W1xK(sI)6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/ + EEE¸¸¸´´´³³³¶¶¶¸¸¸41.xI$wI&pD#oF' ÿÿÿÿÿÿýýýûûûùùùöööôôô^9nF&qF#‚S.‡U/xF„R+ˆV/ˆV/ƒQ*…T-xJ%rF$6!`;lD%wL+|M)ƒR,€O(—e>Ž\5„R+ˆW1xK&qF$g?!ÿÿÿÿÿÿýýýûûûùùùöööôôôgB&kC$xM*~O*P)€O'Q*€P,{N+tI'C:+¡¦ƒdgPV3`>$&#!’’’ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐÐnnn^YThE(þþþûûûõõõíííåååÝÝÝ666***>>>BBBGGGKKKOOOSSSWWWOOO666ˆˆˆàààççç^A*iJ24$ +nJ.‰aB–kHœmH¡qJ›mG‘fC8)08)08)08)06(/7(/8)08)07)07)08)08*19*1=/5yT6ƒ[:T2‘d@žnH›jD¿¿¿¼¼¼¹¹¹½½½¿¿¿742”e>—hDb?{Q1>+ÿÿÿÿÿÿýýýûûûùùùöööôôôwR4Ša@d@Ž^7 mE¯|Sšg>•b9¬yP³W«yPškE‘eAB- +}X:|T4†Z7‘b<¬zR¯|S§tK­zQ­zQ¤rI¦vPa=‚Y8ÿÿÿÿÿÿýýýûûûùùùöööôôô€Z;‹a@–iE¥uN–c;£qH›jBŠ[5“fCmYA‘—zŠ’sŠ’seiU;*=<<¦¦¦ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐÐvqmxU8þþþûûûôôôìììåååÝÝÝ666555LLLPPPTTTYYYKKK*** OOO±±±àààèèè`C,eH0/ wT8…]>šoM—gBŸmF¦vP›nJ }U5dB—jF_;¢rL¥tMÀÀÀ¼¼¼»»»¿¿¿ÀÀÀ963›kD`:•iEŒcBmH,ÿÿÿÿÿÿýýýûûûùùùöööôôô€Y:~T2›mI§vO–b:±}T§sJ«wN±}T·ƒZ·„[–e>™kGF1  ~X:ŽdC”gC pJ²Wº†]§sJ©uL²~U«xO¬zT‘c>‘fDÿÿÿÿÿÿýýýûûûùùùöööôôôƒZ:—kIŸqL°~W¡nE§tK¦tLœmHŠ^;|r]ÛÞ½äèÅäèÅÊȬ ¸··¬¬¬ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¦¡tP4þþþûûûôôôìììåååÝÝÝ666@@@ZZZ@@@%%% RRR“““ÊÊÊÑÑÑÙÙÙáááèèèeI1gH16& zW;„\=’gD£uP¬|U¡qJ›mI˜lJŠbBƒ]>qL0sP4wU:wU:;):(sQ6rP5xU;{Y>rP54$dG1‰aA“iG`=–iD§xS«{T¬{UÀÀÀ¼¼¼»»»¿¿¿ÀÀÀ963§wPª{U‘d@‰`>‹cD1"ÿÿÿÿÿÿýýýûûûùùùöööôôôŠaA›oLœmH£qJ²V¹…\²~U·ƒZ¶‚Y²~U²V­|U¥vRG1 "gG”hF¨zV®}W´€X´€W¹…\·ƒZ­yP³€W®|U¥vQšmJ—mK—jG qK°~W±~U²VšiBškG–lJ__SÒÓ¶äèÅäèÅÌÈ­ ÈÇÇ«««ÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¥¡sN3þþþûûûôôôíííåååÞÞÞ666 BBB{{{¸¸¸¿¿¿ÇÇÇÎÎÎÖÖÖÝÝÝãããêêêP2Y9!. kI-jD%vL,‡Y6Š[7Š\8yN,oF':'#tO3uP3rK.vP2yS5yS5jD&jD&tN0nG)sL.Y9 2 ƒX6ˆ[8”fA˜iC]8”d>¡pIÀÀÀ¼¼¼»»»¿¿¿ÀÀÀ631“b;“c<•gC‹`>yQ0O6!*€U3‡Z6›kF¢oH mDªvM¤pGªvMšf=Y0•b9]6™jDvN/Z9Z;#T7 V;%T:%Q8#S:%P6"T;&L3D*J1H/O5!M4F-I/K1R7"[?(hG-†\:‹^;›lG—f?Y1—c:™e<œh?¡mD]4‹Y2`:Œ^9Žb?†\:~U5xR3zU7uP3nG(tL+V5„W4_:‰X2‹Y1žjAœh@œkE’d@U4'$”œ{°»‘°»‘`aO+ÇÇƪªªÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¦¡Z>þþþûûûõõõîîîæææàààDDD???zzz¦¦¦¸¸¸¸¸¸»»»ÁÁÁÈÈÈÎÎÎÕÕÕÜÜÜâââèèèííí]>$pN57' +M4!O4 [>'N7%K6&,3~Z=„]>‰`@{R1}S2€V5~T3€V5fE—mL”jIxM+)Š`>›lG£sM§wP¢rL`9—f?ÀÀÀ¼¼¼»»»¿¿¿ÀÀÀ741lE¥uN™kE›nKdCtL- H0cB(pO4}[?‰cEV6}Q0“fCnI£rK±W­yP›g>ŸkBœh?œh?œh?©vM±~W²[™jF„W3‘fD‰`@ŠcD‡`B|W9vP2rL.oJ,qK-lG){U7‚]?ŒfH~X:oJ,[=~X:‹dEgGeDdA‹]9`:œjC–c:ªvM´€WÀŒc´€W“_6©vN¢qJ¦vQ¢tP™lI‘eC{Q0~U4‚X8€V4‹_=œoKª{W§wRˆW0¡nF©uL¬yQªyS›nJŠaA]XJÛÞ½äèÅä蟹  ÇÇƪªªÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¥ oJ,  +[9]95# ++,, + +- NYy¡©† lI-~W7ƒW4”fBb>—iE•gC™lHžpLšlHa=~O+f?!0’a;˜f?˜f>˜g@¢qJ™gAÀÀÀ¼¼¼»»»¿¿¿ÀÀÀ631€O(–e>‘b<‰Z6‡[8‰_?N5! uP4xT7yT6ƒZ:xM+}P,yJ%”c>—e>™f>ŸkB¬xO¥qH§sJ«wN¯{R¬xO¬zR oH‚R,R-vH$‡[8‚W5‚X6‚X8†\<‚X8‚X8ˆ_>‹a@‰`?”jIŠ`@pF%oE$nD$|R1„Y7ˆ\:c?Ž`;•e?žmF mF©uL­yP¹…\´€W\3ŠV-‹X0’_8šiB—gA”e?‰[6b>`=c?•gCœmH¥uP§vP’`9…S+ŠW/\3jA–e>b?|S2^TE®³•ÊÒ«ÊÒ«ŽyÇÆÆ©©©ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¥ œpJ,oI+zT5zT5sN2eD)_@(V9!Q4Q4L1U:%M2P6 N4M3O4W;&Y<'Y='X;$X;#Z<$[;#\: fB%sM0oH*dB&W:#W:#V9"U:$Q8#S9%L3L2N4 K2H.I/M4 H.I/J1M4 K36$*¯ ´,,¸76¹:9·54´,,±##­©¥kH,}S1–gAŸnFŸnFšhA•c<šhA•c<ŒZ3]5’_8Z2aA(/]7—e=ŸnFžmF›jD¿¿¿¼¼¼¹¹¹½½½ÀÀÀ631•d=•d=‹Z4`:‹^9Š_=†\< +iF,qJ+pH({Q0€S/ŠZ5Ž^8™g@”b:šf>™e<¨tK§sJ¦rIŸkB¡mDšf=]5]5‰X0—hA‰Z4Ž^:ˆZ7…W4…Y5b>Ž`=Ž`=‰[7…Y5ˆ[7ƒU2|P,T0Š]9‚U1ƒU1ˆZ5Œ]8Ž_:•e?šiC£qJ—d=™f=žkB›g>“_6”`7ŸkB“_6“`8•b:œjBšhA—f?œkD¢qK”c<–e>™g@–d=]5’_6–c;\3œh?–c;”c<„X4‚Y8}t`ÒÓ¶äèÅäèÅÉÆ« +ÇÆÆ©©©ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±§¡žuN0zS4vN/„\<‡_@~Y$mK2sR7uS8xU:rO3sO3rM0sK,‹cCcCŠ`?Ša?€W6}T4sK,}W9‚]?„^A[>}X:}W9sN0pK-‡bD~X;}X:Y;tN0oL/a?%²('¸76¼DD¼CC¸98´--°""¬© ¥qM1V4^7¦rI¶‚Y·ƒZ³V¯{R²~U lC£oF³V±}T°|SwS7 kG+’`9˜g@¥tM¼¼¼¸¸¸µµµººº¼¼¼852¥tN¢qKžmF‘b;a;ˆZ7Žc@I4#4$†]<‡]<…X4–gA¬{S«yQ¥rJ¥qIŸkB¤pGšf=«wN³V²~U¶‚Y¨tK£pG˜f>•c=¤tM¥uOŸpJ—hC“d?“d?ŠZ5œkF¢sN£sN¤uP›kF—iDŽ`;‰Z5£tO¡qLžmHnI•e@”c<Œ\6 pJ¨xQ¬{T«yR§uN©vNœiAšf>¼ˆ_®zQ­yP®zQ¡nEŸlC–c:¨uM²~VµY³€W®{R°}TŸkB¡mD¹…\­yP¬xO©vMœkE†Y5xO.PH7¦‚°»‘°»‘~gÇÆÆ©©©ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±©¤ ‚\=Y:Š`?“iFŒb@„\<‡aBƒ]@€Z<‚]?}W;vR5[={W:[>}X;wQ4Y<‚\=„^?}W8„]>‡`@†_?‰_?ˆ]:a?—lH”gD™lJ›nKŠ];dCŒbAdCˆ^>Ša@ŽeD‹bA†]<|R2ŒbBŒbB‰`?dC”jJƒ[;xT6³+*¹:9½EE»??·54³))¯«§ + ž[?Œa?žlE¤pG§sJ®zQ±}T³V¸„[´€W¡mD¶‚YªvM­yP¬xO—lK (aB*wR5»»»¶¶¶´´´¸¸¸ººº631¡qK¦vO¬{U£rKžmF˜iC–iEŠa@ gF™mJ¤uQ¦vO¤rJ±}T²~U·ƒZ¯{R©uL­yP´€W®zQ¬xOµX²~V¬zR­{T¤sLšjE£tOœnI¡sNŸpL•e@ŸoI qK¢rM™iDŸpJ¡rMšlH˜jF‘c>˜iD¢sMžnI¤tO¦vP•d?žoIšlGœnJ™jFnI¥uO¥tM¢pI–d<®{S®zQ¬xO²~U»‡^«wNªvM¨tK©uL­yP°|S´€W´€W®zQšf=¿‹b¬xO¬xO¬yQ°X”gC„Z:`YEÁǤÊÒ«ÊÒ«¤§Š ÇÇÆ©©©ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¨£Ÿƒ\<ŽeDžrP”fB˜jG¦zWžrP’hF’gF€V4˜nM‹a@ƒY8ŒcBŽcCcAdCšoM‘eC‘fCŸsRœqNqN˜lIb?£uP˜iD”d@oJ£sO¢tN•fA¦xTpL”gC¢uQ¬[¤wS™lH•hD›nJŒ^;b>˜kGpLpL’eB‘hH…µ32¸87¶43´,+°"!¬©¤—yV:‘fD³Z¶‚YªvM´€WË—n¼ˆ_¯{R´€W«wN lC¢nE«wN¬xO°|S®{S|Y>8( +GGG¼¼¼···´´´¸¸¸ººº631œkE¥uN¥tM¥tM®|U²[™jF—jF@/"U<(pMŒ]9¨xRªxP¤pH°|S¯{R¬xO³V¾ŠaªvM¯{RÃf¾Ša°}UªyQ”d>­}X™kGŒ_<“gE”hF”hF—jF¤vR™kH—iF¨yU¤vR¡tQ•jGŠ_=˜mJ‘d@b?™lHpLžpL‘c?¡tP˜lJŽc@qN«~[¦xTŸoJ¡pJ«yR›h@¤pG¯{R´€WµX¬xOº†]µX©uL·ƒZÑtº†]­yP°|S²~Ui@¢nE­yP®{R©xQœnJ™oM__SÛÞ½äèÅäèÅÎαÇÇƪªªÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±©£ •mLœqP¥xT­|Wµ„^´…_«|V­~X™jE­~Y”d?^9•fA¡rM¦wR¥vQ±ƒ_¯“{«‰l°”{¸k²‚]¯€[œlF²[™iCšhA›jE­Šl´–}®…eºˆa´‚[ª~[µ˜~¼ž…»j¯~W oH·†_mG¬zTlE£rK¬{UªyR²–|¢e „²('³+*²'&°! ­ª¦Ÿ’{W;žsQºˆa¶‚Y¿‹b̘oÇ“j¼ˆ_±}TÇ“jÁdÀŒc¯{R©uL´€W­yP¾Šb¾Œd²€YŽfGXXXkkkhhhfffhhh... €X9ªyS¤sLºˆ`º‡`²Z«|W«~Z‹fJ +•iF¨{W›lG§vO¤qI³V³V¿‹bÁdÀŒc¼ˆ_ÃfÄg¼ˆ`¹‡_ŸnH¤wTH1! "$$%)G3#šnK™pOU?-*'!&  ! =)“gDœqNB/)'#&))O9'Œa?±‚\lE³€X§sJ­yP¶‚YµXÁd¿‹b±}T½‰`ΚqÇ“jº†]­yPÉ•l¶‚Y¾Ša«wN«wN²V©wP¬}X£xUcYH¥¨ÊÒ«ÊÒ«‰vÈÇǪªªÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±©¤Ÿ…[;~S1†X3†T-‚O'’_7«xP•b9~K#„Q)\3Z1˜e=™f>¡nF¡nF¯—‚ζØÈ»ÒĶ·ª½³¦½³¦½³¦½´§½´§¾´¨¿µ¨ÐµÖǺÎÀ³À¶©¿µ¨Á·ªÖɽÖǻŬ¿µ¨¿µ¨¿µ¨¿µ¨¿µ¨¿µ¨¿µ¨¿µ¨¿µ¨Ò÷«¢– ®®®«©¦¤l xT8‚V4[4–b9‚O&\3 mD¦rI”`7„P'ŽZ1ŽZ1“_6™e<¡mD±}TžkB“`8˜f>ƒQ*y]G‚fP…jTx^HoU@tZE# ™iB§vO¢oH—e<–d<|K%zL'„W3%O0wK'}O*†V0•b;žkB¬xO¨tK˜d;—c:[2‡S*•a8®{R“a9wG!cA%rrrrrrHHH tJ)[8rrriiiqqq€V4W7*% BBBrrrrrrc?"zL'„S-‰W/\3¡mD lC©uL™e<–b9\3„P'“_6§sJ§sJ”`7‡S*ŒX/‰U,’^5žjAŸlC§uNŽ^8€S/q]BeiUŠ’seiUeiU.xww///àààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¨£Ÿ|S2„X6“e@©wOµX½‰`¯{RŸkBªvM¤pG¯{R¨tK¨tK›g>ªvMŸkB¹¥‘ãÑÃîÚÍîØËîÚÍïÜÐïÚÎïÚÌïÛÏïÚÍïÛÏïÛÍïÛÎðÞÒðÞÓðßÔðÞÓïÜÑðÞÓïÜÏïÝÑïÜÐïÝÑðÞÓïÛÏïÛÏðÞÒñáÖïÛÎïÛÏêØÌ­¤˜ ªª¨£ + žœ˜l vR5…Y6¤rJ§tL‘eBªyR©wP¦sKjA©uL´€W›g>£oF¡mDžjA«wNœh?¦sK¤qI¦tM¬zS¬{T¢qJ`;—iDnI“b<ŸnGšh@œi@¢oG§vP¤uP¢uQ]A+%c@b?œmG oH–c;¨tKi@žjA¤pG¯{R¶‚Y½‰`­zQšhA™jDŒ_<$gD) mJ.…]=ŠbC$ ^@(/  '}T5‚Z:oK/  +_C. +‚X7‘eA§wR™g@™f=¤pG§sJ§sJœh?¥qH¬xO°|S¶‚Y«wN¯{R¢nE¬xO¶‚Y¡mDi@¡mD¡mD¦sK”c=™jF‘eBŒa@5- !sP5gE*ÈÈǬ¬¬ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±©¤ ‹bAŠ_=”e@“`9Y0”`7\3ŠV-—c:’^5ŒX/ŸkB›g>žjA©uL«wNº¦’âÏÂîÙÌîÙÌïÚÌðÝÐðÝÐïÚÍïÜÏïÛÏïÝÑïÛÏïÛÏïÝÑñÞÓñÞÓðÝÑñÞÓðÜÐðßÒñßÓðßÒðÞÑðÜÐðÜÐðÞÒñÞÓðÞÒðÜÐïÛÏëÙΫ¢—¤¥¢œ—”““‘z xS7’fD‘`:™hA;'|O+‚R,”b:ŽZ1“_6‹W.žjAœh?ªvM²~U®zQ›h?¦sKˆV.“b:‡V.‚Q*‰X2‚S.‡X3£rK¨wPªxQ mD¨uM‰W0†V0}O+zM* +hD'vI%b=`9žlD«xO°|S¦rI£oFšf=ŽZ1”a8Y2O)ƒV2tJ);$  G1lG*rN0iD'Q5 nI+qL/{U8wQ4 +S6oH)pF$Q-’a;–c;ŸlC®zQ§sJ¯{Ršf=œh?“_6œh?ŒX/’^5˜d;ŽZ1‘]4’^5šf=žjA­yP©vN¥tM_9’d?zN*V4oF&e?!jE)ÉÈÇ­­­ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿ```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¥ œtK*~R0}N)ƒQ)†R)…Q(‚N%„P'ŒX/\3‘]4•a8’^5“_6‰U,’^5¶¡ãÒÅðÜÐðÝÐðÞÒðÝÒðÞÑïÛÏïÛÎïÝÒïÜÐñÞÓðÞÒðÝÐñßÓñßÔðÞÓñßÕðÝÒðßÔðÝÒðÞÓñàÖñàÖðÝÒðÝÒñàÕòâ×ñßÓñÞÓìÙΫ¢–¤¢œ–‘Œ‰‰‰ˆb>"yN,ˆY4\:D(rE"ƒS,Z2\3“_6‘]4›g>‚N%Y0\3’_6Y1‚O'~L$L$M%€O(„T.‚S-}L&†U.ŠX1’_6ŒX/|I"yI"vG#sF"@'.~R/|O+…U0…T,ˆU-“_6—c:‹W.‰U,…R*€N&yH"tF"qG&iC%*ŽŽŽääääääää䎎Ž& U6X8W6$ ŽŽŽääääääääääää]e=e?!ÉÈÈ®®®ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿ000ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¨£ŸzP0ƒW5–gB™f>•a8©uL¶‚Y­yP­yPªvM²~U­yP£oF¡mD©uLšf=·£ŽäÓÆïÜÏðÝÑïÛÏïÛÏïÛÎîÜÑîÜÐîÚÎìÛÎìÚÎìÚÐéÖÌéÖÌé×Íê×Íê×ÍëÙÐêØÎê×ÍìÛÑìÛÐíÛÐïÝÓïÝÒïÝÒðÝÓñßÕðÝÒëÙÌ«¢–¤Ÿ™’Œ†‚…W;$xN.d@  ‚^A™lH¨vO­zR´€W§sJ›g>¡mD£oF–b9§sJ¬xOi@]4¸„\²V«yQ©xQ pI—f?œkE’`8¢oFªvM—d<Ž\5¥uPŸqMŽdC +‘gF–hE_:—g@£pH™e±}T«wN·£ŽäÒÆïÛÏïÛÎðÞÒðÞÓïßÔíÚÏëÚÐæÖÉäÔËáÑÇÝÍÃÛÊÀÙȾÙÉ¿ÚÌÄÚËÂÙÊÁÙÊÀÛËÁÞÎÄàÒÇäÔËçØÎêÚÑíÛÐñàÖñÞÓñàÕëØά¤˜ ž—‰‚|u|„,J4!zT53!  †`B•gC«yR¯|S¸„[ŸkB°|S­yP¦rI•a8«wN©uL´€W´€W´€W¶ƒ[¡oH“hFžmF¢qJ¡oG•b9¢nE¥rI¥sK¤sMžpK sP8'L6$›nK‘c?‘a;§uM¦rJ™e<œh?¦rJ›iBŸoI ŽdC rN—gAªxQ¤qH¦rI–b9±}T²~U´€W±}T»‡^³V«wN´€W®zQº†]¡mD°|S©uL£oF“`7­zQªwN±~V¥uOšnK‘iHÊÉÉ°°°ËËËÙÙÙëëëúúúÿÿÿÿÿÿ€€€```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐÐqqqhc_ŒcBdA™kFªyQ±~V²€Y­{T¥sL¢qJ´‚\¬zS©wO£pH©vM¨tK´€Wº£çÕÉïÜÐïÛÎïÜÑðÞÒîÛÏêÙÎäÔËßÍÃÚÊÀÖƽÐÁ¸Ë½µÇ¸¯Ç¹°Çº°Çº°Ç»²Èº±Ê¼´ÏÀ·ÔƼÚËÁßÒÈä×ÎêÚÑîÞÔñßÔñßÔìÙᦛfOKHEA><?35$I2  +‰_?¦wS nG´€X¬xO¥qH¢nE§sJ­yP°|SµX±}T»‡^°|S¨uL‰^:¥tM›iC¥sK¯|S­yP­yP°}U±€Y¢rM–iEzS4 ˜lI”gC›lGlE®{S¬xO¬xO±~U­|V§xSŸx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\v[›tYštYštY›tYv[v[›tYštY™sXštYštYštYštY›uZv[v[žw[v[v[v[žw[Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\†]=˜lInIlE¤qI§sJ¥qH­yP¹…\­yP³V°|S±}T¸„[¹…\§sJ·ƒZ­yP¥qH£oF¦rI¦rI°|SµX­zQ¨xR—jG‰_>ÊÊÉ°°°ËËËÙÙÙëëëúúúÿÿÿððð ðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¦¡uK+wK*€S/Q+ƒS,xH#{M(…W3€R-‚T0|M(~N(„S-Ž\4‘^5’_6½±¢íÛÏïÛÏïÛÏñÞÓòàÖîÜÏæÔÉßÎÅÏû×ȾÞÐÆåÙÏîÞÔñáÕòâØíÛк¯£-' ,-,*( +7"H.N4 +%#"$""$ e>pA†T-ŒX0•a8˜d;–b9ŠV-ŽZ1”`7ŽZ1ˆT+ŠV-“`8a>#‘`9‘`9‘^7ŠW.\3Y0ŠW.‚P(Q+…W3T1 +H,yL)…W3Œ\6]6\3”`7‰V.„T-tF"oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@a:rH&}O+‡W1”a9‘]4[2\3’^5’^5†R)‘]4—c:’^5‹W.‚N%Y0[2”`7—c:”`7Y0ŽZ1Y0\4~M'yL)yO.ÊÉÉ°°°ËËËÙÙÙëëëúúúÿÿÿPPP   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¨¢žzR3xN-€T2ˆZ7•hDŠ^;€U3mM4H2"‰aA…Y6‰\8‰Z5¨xR©wOžkC²›…ãÒÅïÝÑðÞÒðÞÒñßÓìÙÎãÑÈÛÊÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƺ³ÏÁ¸ØÊÀä×ÏíÝÓðàÕòâØîÞÒÀ´¨vW=tP4|U7qK-ŠcD…^?Z<~W8kD%~V8[=cE- +--,10/+*)"!  + jC%”fB¤sL­zQ®zQ lC›g>—c:®zQ¬xO¡mD®zQ·ƒ[ªxQ¯~W oHšg?˜e<˜d;©uL­yP mE›jD¦wRœoKiJ2#†Y6 rNœmG—f?“`8™e<–c;œmGŒ_<˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX™sYštYštYštYštYštYštYštYštYštYštY˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rXhC&„[:™mJškF£pH£oF¡mD\3¨tK¨tKœh?¹…\³V­yP¨tK[2©uL²~U«wN®zQ¢nEžjA‘]4©uL§tK”c=›nK“iHÊÊÉ°°°ËËËÙÙÙëëëëëëPPP   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¦¡rK-yR3~T4fDŒbAS:&!/ [<$b?$pD!Ž`;”c=“a9»¯¡ðÞÒïÜÏñßÔðÞÑñàÖìÚÐáÐÅÖƾÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº¯¦Æº²ÓǾàÓÉëÜÓòãÙòãÙòâØź­¢z\“e@”gC‘dAšlGžpK˜iEa=…W4pD!jG- --,:98:98210'%%  X7ˆ[7_9˜e= lCœh?¨tK¤pG£oF§sJ¯{R§tK§uNyT7Ž]6•d=—d=jA lC´€W«wNªwO©wOœlFšlH’eB b>"…X5_:_8›iAžkB«xPnIŽcAoS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@eB'b;‡\:Œ]8–c<¨tK lC©uL¦rIªvM§sJ®zQ²~U«wN¢nEšf=†R)¡mD›g>›g>¥qHžjA©uL¤pG¡nE˜gA–iFŠ`?ÊÊÉ°°°ËËËÙÙÙÝÝÝOOO°°°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¤ŸœrM0sN0X9R:&  }S2‚U2‹\7–e>¼²¦îÜÐðÜÏðÜÐñàÔðÝÒëÙÎßÎÅÐÀ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±§¢¾³¬ÍºÛÎÆéÛÐñá×òâ×ñâ׿µ¨£pH¦tM•c<™g?jC•b:]5jB—e>J0 +$""654CBBA@@554)(' [<"U2•e?šh@­yP­yP¥qHžjA”`7 lC›h?–d=“b;‹Z3“b;œjB¤qH­yP©uL£oF–b9œjB•d=^9†Y5M4 1 T1‡Y5’b=˜f?§tK§uM–gB‚W5˜rX›tYv[v[›uZ˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rXštYštYštYštYštYštYštYštY›tYv[v[Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\hF+oI*xM,‰Z6 mF¡mD©uL¨tK¬xOi@ lC¡mD™e<•a8¢nE lC’^5”`7˜d;¥qHi@­yP¬xO§sJ›h?Ž^8‰\9{Q0ÊÉÉ°°°ËËˈˆˆÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¤Ÿ›iG,;)!!!###]?'…Z9Š]:—gA¹¯£íÛÐðÞÒðÞÑñßÕðßÔêÙÏÛÊÀʼ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦˜¶«¥È¼µ×ËÃçÚÐñãÙòâ×òãØÁ·ª¯{R°|S²~U°|S´€W«wN lC lC¥sL &%$765GGFCBB554(&% >+Š^:ŸnG¦rJ°|S´€W¯{R®zQ¶‚Y®{RžmE–e>˜g@šhBžlD§tK²~U¯{R«wN­yP²~V¨vO—hB‰[7U4 +U4Š]:‘b=¡pJ­zR¢pH˜jEcAoS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@rP5~W9„Z8™kFšhA¨tK­yP¯{R±}T²~U°|S´€W¬xO¡mD¡mD¬xO¬xO¢nE¨tK lC¦rI«wN®zQµX®{R£rLpMŒbAÊÉÉ+++ ___ÝÝÝúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¤Ÿœ8' """### + + + ‹cC‘fDžpKµ¬ ëÙÏðÝÒðÞÑñàÖðÝÒê×ÍÙÊÁǹ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–‘²¨£Ã¸±ÖÊÂçÚÐòäÚòâ×óäÚÁ·ª°|S²~U²~U¯{R³V³V·ƒZ¢nE±X‰^<1"10/=<;;:90/.$"" + + ‘gFšjD¡nE¨tKªvMµX°|S¨tKµY«yR£rK¨wP¨wP¢pH¥rI¨tK¬xO²~U°|S¥qH°}V¨wQ›mI›nK4#M7%˜kH—iE›kF¢pI©xQ qLdCštYštYštYštYštYštYštYštYštYštYštY›uZv[v[v[v[v[v[v[v[štYštYštY™sXštYštY›uZv[v[Ÿx\Ÿx\Ÿx\žw[tQ6zT6eCœmI²€Y­yP£oF¯{R±}T²~U°|S²~U´€W¶‚Y£oFº†]§sJ­yP±}T·ƒZªvM£oFªvM®zQ±~U¤sM”gD”jIÊÊÉWWW@@@)))“““úúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐа°°¢ž›[@+ + + +###### [?)Ša@–jG±§œçÖËîÛÏñßÓðÝÒðßÔêØÎÚËÂÈ»²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–’²¨¢Ã·¯ÕÈ¿çÙÏñãÙòãÙòâ×Á·ª¼ˆ_Å‘h³VÂŽeÍ™p©uLº†] lC¢pH¢rMeC 0/.0/.('&V:$ŽdC³„^°}T»‡^Å‘hº†]º†]Ë—n¸„\ªxQ™gA›iC¦uN³€Y¶‚Z»‡^½‰`»‡^¼ˆ_Ádº†^£qJ—hC›nJZ; •iFšlI¯\­|V²€Z©zUœrPoS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@mK0„^?cB—iE§uMÅ‘h­yP»‡^Å‘h³VÃfÍ™pªvM¹…\¡mD¨tK±}T²~U¥qH¯{RÈ”k±}T»‡^Ãf´€X°Y±„afEÊÊÉ°°°ËËËÌÌÌvvv^^^ðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐа°°—”’  ###############$ŒeF˜mL«¢—âÑÆë×ÊðÝÒðÝÐñá×êØÎÚËÂȺ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–‘²¨¢Ã¸°ÕÊÂèÛÑñá×òâ×ñáÖÁ·ª¸„[»‡^¼ˆ_½‰`¹…\¤pGÁdªvM²VlDŽ_;‹bA0# $"" + + N5 Y;›oL¬{Uº‡^Ád·ƒZ·ƒZÂŽeÃfªwN§uN®}VŸnG¬{U·„]·ƒ[¼ˆ_¸„[¶‚YÆ’iÂŽe°}T£pI®}W‰[6–iE$cG1¤wS¨zU¬|V®|W qM¡vU›uZv[štYštY™sY˜rX˜rX˜rX˜rX™sYv[v[v[œuZštYštY›uZ›tY˜rX™sY™sX˜rX˜rX˜rX™sYœuZœuZštYštYštYštYštY›uZuS8vP2‚X7oK³Z»‡^»‡^¸„[»‡^»‡^½‰`º†]¤pG¿‹b«wNµX¥qHŸkB¯{Rº†]·ƒZ¾ŠaÁd»‡^µY±€Z¥xU‡^=ÊÊÉ°°°ËËËÙÙÙëëëÌÌÌ@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐа°°’!!!###"""###############bB(W6¥’ÜɾçÕÈîÛÏðÝÐñßÕêØÐÙÊÀÈ»²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–‘±§ Ã¸±ÕÉÀçØÎñáÖñâ×òáÖÁ·ª lCi@šf=™e<ŽZ1“_6[2[2\3“`7™g@a<U47$  V8 pK-…Y7”d?›iA“_6§sJ›g>žjAŸkB•a8‰V.[4ŠY3›iC›jD nF–c:¥qH–b9£oFžjAœh?‰U,ŠW/ŠY3‚S.‚T1\<$#‘dA…W3”d>•d>Œ]:~S2oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@a>#mG)‚X7‹]8”b;ŸkBšf=ŸkBœh?™e<™e<ŽZ1“_6\3[2\3•a8ŸkB lCžjAi@•a8£oF˜d;•b:`9{O+rH'ÊÉÉ°°°ËËËÙÙÙëëëúúú°°°PPPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐа°°Ÿ›˜###  !!!################## ,„]>Ÿ—ŒÖÆ»âÏÅìÙÍðÝÒðßÒéÖÌÚËÁɹ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£™‘´©¡Æº²ÖÉÀèÚÐðàÕòâØñáÕÁ·ª½‰`°|Sšf=›g>±}T¶‚YÀŒcº†]£oF¡mDžkB¡oHœmH’hGP9'$eE+wQ2‚V4™iC¤qI°|S²~Uº†]´€W–b9–b9®zQ°}TªxQ¨wP–e> oH®|T£pG·ƒZ¿‹b˜d;\3¯{R°|S³€W©wOœlF’c?Š]9 ~Y;‘b>¦vQ­}W‰[7rG%™sXštYštYštYštY˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX™sYštYštYv[v[v[v[v[v[v[v[v[v[hE*vP1‚X7—iE¨vN²~U³V½‰`°|Sšf=›g>°|S¶‚Y¾Ša¹…\£oF¡mDŸkB¨tK¬xO´€WµX¼ˆ_°|S”a9]7”gDgFÊÊÉ°°°ËËËÙÙÙëëëúúúÿÿÿ€€€pppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐа°° œ™2"########################iG-›“ˆÒøàÏÃêÖÊðÞÓñÞÓêÙÍÝÌÂο·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¡™»¯§Ë½´ÚÍÄèÙÏðáÖòâØñàÖÁ·ª–b9\3•a8ŽZ1™e"pJ,U4‘c>“b:§sJ—c:—c:[2•a8Y0˜d;žjAŸkB”`7[2—c:žjA¥qH¢nE¦rI’^5i@ŠV-]5…T.}P-€V5ÊÉÉ°°°ËËËÙÙÙëëëúúúÿÿÿÿÿÿ000ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¢š]?'### !!!################## -˜†Î¼±ÝÌÁåÑÅèÖÌêÙÏåÑÆÜË¿ÑÁ·¸¬¥Ãµ­Ð¸ÞÒÉéÙÐðÞÓñàÕñàÕÁ·ªšf=ªvM«wN—c: lC›g>\3–b9i@§sJ³V¨tK¨tK¡nGœlF…Y7K3!V8!nG)‚V3–f?±~UŸkB®zQŸkB©uL¤pG©uL¢nEŸkBœh?]5’`9\5–e>¥tM™f>§tK¥qH¤pG lC¢nEœh?’^5›g>“`8•c<\6œlFŠ^: 9&›kE˜gA”c>`<ƒX6v[štYštY›uZv[v[v[v[v[v[v[v[›uZv[v[v[v[žw\Ÿx\Ÿx\v[v[v[Ÿx\Ÿx\v[v[v[v[v[Ÿx\Ÿx\¢z^hE*X:eC˜jFžlE©uL©uLšf=ªvM«wN—c:ŸkBšf=‘]4–b9œh?¦rI³V§sJªvM¤pG©uLŸlC¤qH¢pG^7„Y6vM,ÊÉÈ°°°ËËËÙÙÙëëëúúúÿÿÿÿÿÿ°°°@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¢žšdB)0  + + +###### ###### Ž‡}Á°¥Ìº°ÑÀ¶ÑÀ´Òúѿ´Ð¿µÎ¾²Èº±Â³ª¸ª¢¯¡™¤˜ž“ž”Žž”Žž’‹ž“ž“‹¢˜¬ ™¶ª¢Á´¬Ë½³ÕƽáÒÊêØÎðÝÒñÞÓñàÖÆ»¯´ˆc–b9—c:©uL´€W­yP¬xO¬xO®zQžjAœh?§sJ lCœh?¨uMnHyO-*S:&{V9“hE¡qKjBœh?¦rIi@™e<®zQ§sJŸkBŸkBŸkB¶‚Y§tK¨vO¨wPžmF˜g@–c<§tK¤pG lC›g> lC»‡^®zQ¬xO­yP±W¡pI•d=—f@šjD•d>“b<–e>lF…V2‚W5oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@vS7vO0„Y7”fAœjB¤pG«wN±}T–b9™e<¨tK³V¬xO­yP­yP®zQžjAšf=§sJjA™f>¨uM¤rK]6•d=`<’hEƒ[;ÊÉÉ°°°ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±£ž›oM2[?(### @,yphˆ¢–Œš‡ + lc^Ÿ’Š½¯¥Ä³ªÄ¶¬Á²¨¼¯¦´¥°¤°¥°¢š°£›°¢š°¢š³¥žº­¥Ãµ­Ì½µÓùÜÊÀå×ÏìÜÒñßÕðÝÒðÞÓØʽ´•z¤pG®zQ¹…\ÀŒc¸„[«wN°|S°|S¸„[ªvM®zQ¢nE­yPšf= mF—hC~V7 !…`BdCŸoJ¬zR´€W§sJ³VžjA®zQžjA™e<§sJ¡mD³Vº†]¼ˆ`¬zSzU7¤sL”c<§uM mD\3¦rI¤pG§sJ·ƒZÂŽe»‡^ªvM©vM®|TlDŸmF˜f?¢qJžlEŠY1 nG”f@‹^;Ÿx\Ÿx\v[v[›tYštYštY˜rX˜rX™sX™sX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rXštYštYštYštYštYv[v[v[žw[v[v[}X;ŽfEc@šjE¢pH¯{R›g>©uL¥qH­yP¹…\ÀŒc¸„[¬xO°|S°|S¸„[©uL­yPžkB¥sL’a:˜hB˜iC‘c>œpM“jJŠcEÉÉÈ®®®ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿPPP   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐС¡¡•ŒuR5iG,( """""" 2~@@% PJF§™‘Á²¨È¹¯Êº±ÄµªÁ±§Á±¨Á±¨Á±¨Á³«Á²©Ã¶­Ê¼´Ï¾µÔÅ»ÛËÁáÐÅæÔÉíÚÏñßÓðÝÐðÝÑØɼ²“x·ƒZ­yP²~U´€W¨tK«wN¼ˆ_²~U±}T«wN¤pG²~U¤pG—c:¤qH®|T¢sN•jGfE‹`=“d?²€Y³V­yP®zQi@®zQ¢nEŸkB§sJ³VµX¹…\¶‚Y§tK›jBšhB¡pIžlD£pG¤pG­yP²~Uº†]¼ˆ_±}T¥qH´€Wº†^ªwO°}U›iA¨uM¨uMšh@žkD¦tM¢sM£vR‡`A’gF’eAmG°}U§sJ˜d;¤pG·ƒZ®zQ²~U³V§sJªvM¼ˆ_²~U°|S«wN¢nE¬zR›jCŒ\6”fAœoL—kHeD‚]>uP3ÉÈÈ­­­ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐÐqqqa]YX2Y5N."""2/ÏÆx±¨[”‹B—W±ZZºVV”00ˆ776±¤›Î¾µÕźÕĺÒÁµÓùÒøÓùÒøÒ¶ÔøØȼÛʾáÒÇãÔÉæÓÇìÙÎîÛÏðÜÐïÞÒïÛÏØɼ¡‚g†R)„P'{G€L#€L#‚N%vBxDK"xD}I ‚N%K"„P'€L#|H~L%xH"uEwG!‚P)s@uA‚N%xDyEM$M$M$€L#‚N%€L#ƒO&€L#}I!\:{J#yH"|I!~J!‚N%zF~J!~J!‡S*€L#‹W.xDs?|HxDƒP'{HzGL#N%s?vEm>oC b9X3J*©©©¨¨¨¨¨¨¨¨¨¨¨¨?%=#?%¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨:">$:! “““¨¨¨¨¨¨¨¨¨¨¨¨<"D(Q0S-Z1j>n?uD}J"{G„P'M$„P'„P'{G€L#M$‚N%uAxD€L#xD{G|J"vFvG" %)]gK%)2+P/­­¬€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐС¡¡—’ŽyR5vP3wQ3, !!!\X4>;$31ÖͶ­a‹ƒ=LH%>²NN¢>>š66£DD½ff¡”‹ÔĺãÓÈäÒÇäÑÅäÑÇäÑÆäÒÇäÔÈåÒÆåÔÈç×ÌèÕÈè×ÌëÙÎíÛÐîÜÒïÜÐïÛÎïÛÎïÛÎØÉ»´”z²~U¤pGžjA±}T©uL«wN¢nE–b9›g>¬xOŸkB­yP®zQ¨tK¤pG°|S¡nE¢oFªwO¤qHªwN¦rIšf=˜d;¨tK©uL®zQ­yP¤pG¥qH­yP¤pG¨tK¨tK¤qH}X:£rK¡pI¤rJ¢oF¦rI©uL¬xO¥qH«wNªvM±}T¢nE lC¥qHi@©uL¨tK¨tK¥qH¥qH¤pH«yR•e?—iEŠ`?[=fD)¤¤¤»»»»»»»»»»»»X<&Z>(^C- ˜˜˜»»»»»»»»»»»»N4U:$Q6  €€€»»»»»»»»»»»»[?)eF-pL1yQ2€U3Œ]9œmG’`9¦sJ¯{RªvM§sJ²~U¤pGžjA±}T©uL«wN£oF•a8›g>¬xOžkB§uMŸoJc@8=-Œšp–¥x–¥x€‹d]]]°°°ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¦¡uN/xQ3vO0nK1  À¸pkf7+)«¢TŸ–J‰<¤MM®JJ™55‘--Ÿ;;W,,40.·¨ÙÆ»êÕÉîÙÌïÝÐïÝÒîÚÍïÝÑîÚÎïÝÑïÝÒîÜÐïÝÑîÜÐïÜÐðÞÒïÝÑïÝÐïÚÍðÝÑïÚÍØÈ»µ–{¨tK§sJ¨tK©uL¯{R­yP¦rIŸkB‰U,žjAŸkB›g>ŸkB¥qH¨tK¨tK¡mD¥qH©uL§sJµX¨tKŸkBŠV-›g>¢nE¢nE lC£oF¨tK¥qH¡mD§sJ¥qH£pGªxQxS6›iC›jD™f>¡oF mDªwN¥rI¨uLœi@©vM«xO¨uL¢oF˜e<”a8 mD¨tKi@£oF lC¦sJ¢pHœkE‘a<’fC„[˜f>–c:ŸkB¦rI©uL¨tK¦rI©uL©uL®zQ®zQ§sJžjA‰U,žjAjA”c<Ž`;‰^;G@-y†a–¥x–¥x[aFÈÇÇ«««ÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¥ œvO0{S5ƒZ;ˆ`@[ŽZ1—c:¢nEi@®zQ°|S«wN¡mD™e<ŸkB™e<¢nE¤pGŸkB•a8‹W.™e<£oFi@®zQ±}TªvM£oF’^5ŸkBžkB˜f?—f?Œ[4™hB˜e>¢pG¬yP©vM¨uL‘^6ŸlCŸlC›h?›h?£pGŒY1\4”a9¢oFœi@£oFªvM²~U®{R˜e>•d=ˆZ5€V3pJ+C-hH.oN5nN4_@'5!_>%a?%eC(_@'G/ F/N5 nI+wN._<‡X1’`9[4•b9 lCŸkB¬xO®zQ°|S lC lC lC˜d;šf=¦rI™e<šf=Y0•a9™gA‰\8ŽdBYT=ƒi–¥x–¥x{‚^ ÇÇƪªªÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¦¡…]>‹dD“iJŽeE‰aB‚\?5% +6$U:%·®flg775!¿¶h¯¦Z„=ic0 q22¢DD8s_Mš}g±’y»œ½žƒ¹š¼‚À¡†¾½žƒºš€º›€»œ¸˜~³“y´”z¹š¾¯žÁ·ªÁ·ªÁ·ªÁ·ªÀ§ºi½‰`µX±}T·ƒZ±}T¤pG¦rI²~U¤pG³V³V¯{R´€W½‰`¶‚Y¼ˆ_·ƒZ²~Uº†]´€W¥qH¥qH«wN›g>µX®zQµXº†]¸„[¸„[¹…\¶‚YµY»‡_²€XžmF—g@¤tM©ySªyS¯|U·…]®|T°}V²€X³Z±X¤rJ—e> nG–d<¨vNªxP®{S­zRµ‚Y»‡_´€X´€W´€X«yP«zT—jF€V5]@(nI-1!lL4B/bF/]B-dI2…`C„_@ ‡aCˆbC‹bA`>—hB«yR¨uL±~U¸„[®zQ²~UÀŒc·ƒZ½‰`µX±}T¸„[²~U¤pG¦rI±}T¢nE³V¯|S¥tMœoL•lKFA.ƒi–¥x–¥xckNÇÆÆ©©©ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐб±±¤Ÿš~W8}V7X8V5}U5pO5 1 KZ# +  ¼³iys> ?+tQ2–hA¤rI³W©vM®{R¥rI™f=©uL«wN±}T°|S­yP¯{R¬xO­yP£oFªvMµX¬xO°|S±}Tœh?ªvM«wN³V³V¬xO°|S°|S¯{R§sJ­yP´€W¯{R¯{R±}TŸkB¨tK§sJ¯{R±}T©uL±}T©uL©uL¢nE«wN³V±}T¯{R­yP¡mD¥rI›h?¨uM¬zR£pH«zS¡pJ—gAmHŸpJœkF›kClE–e>œkE¦vOžmG¨wQ¦uO—f@œkElF§vO¦tM¥sL¤qJ¡nG¢oGžkB£pG®zQ§tK©wP¤tN”jH $ ƒZ9†]=F1 ;)’hFŠ`>G2! >+—jFnH¥sLŸlC©uLµX¬xO¯{R³Vi@ªvM«wN²~U³V«wN°|S¯{R®zQ§sJ­yP´€W¬yP¤sL˜kG~T4LH2Œšp–¥x–¥xv\ ÇÆÆ©©©ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐа°°¡œ™‡_AfG“jJ 8 E D0 +fb=OJ(><"!  +FB(<:852/+(E0zU7 rL­{T©xQ¶„]¬zS½‹d²Y³Z±W¹†^±~V·„\´Y¦sK£pH¬yQ²W«xP¾‹c­zR¾‹c²W·„\µ‚Z¹†^´Y·„\³€X¨uM¢oF¬yP¯|T­zQ¿‹c¬xOÅ‘h°|S¼ˆ_·ƒZÁdº†]¼ˆ_½‰`°|S¨tK¦rI®zQ²~U¿‹b¬xOÅ‘h©vM¹†^¹†^»‰a±X³‚Z´ƒ]›lFŸoJ¨yToI¬|V¡qK¯Y¬|V®Y«{V¤tO«|W–gB¥vQ^9ŸpJªzT«{U¨xQ¬{Tµ„\·„]¸†^¹†^Ä‘hªwN´‚Z¤sL¡sNH2 D1"›pN›pM£xV“hF–lKgG…]=…\<’hF—lI–jG¡uR˜lI£xV—lK’iIfF•lL”jH sP¢tPmGžmE¬yP´€W¯{RÁd±}TÁdµX»‡^¹…\½‰`¸„[»‡^·ƒZ¬xO¥qH¯{R±}T¯{R¾‹b¢qK¬[ŠaA8=-Œšp–¥x–¥x‹dÇÆƨ¨¨ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÐÐЯ¯¯ ›—ˆbE‹eFmO7=P B`6ª€Å²¡¤°%H%& !& + + #_C+}W8b=a=_;¥wS¤uQ£uQ rMškFª{V­}X­~Y£tN™iCžnH¢rL¦vP™jD]7¦vQ«{U­}W¦vQ¡qK«{U¦vQ¸ˆb§wQ™iC›kE¦uO¬{T¢pJ]5ªxPµ‚Z»ˆ_´€W¶‚Y°|S±}TÇ“j¼ˆ_§sJ¥qH´€W©uL²~U•a8®zQ¸„[¾Ša°}T¶„\°}V®|U¿Žf¶…^£sM“e@¤uP" ™jE§yTª{V£tN¬}X§xS¢sO³…a•mOpLˆ[7ŸqM†X4šlH‰Z5™jD¯Y¯~X²Z´ƒ[®|TªxPÅ’j¾Šb¬yQ“b;¥vP‘b>„W3ƒX6…[:˜oN—mK tRpM–iFšmI¬~Z sO—jG‡\:‘fDeBc@`=‹]9¤vQ¢tQžqMšnJdBœqOžsP¤wTžpL˜iC pI©wP³W§sJ˜d;´€W»‡^½‰`µX°|S¸„[³VÈ”k¶‚Y¦rI¨tK²~U·ƒZ¬xO•a8­zR¬{U¤wTfEFA.y†a–¥x–¥x`eIÇÆƨ¨¨ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÏÏϯ¯¯›–“yT7sN0@,0 %<|niAU- Wz:Op"3X?\(K_=P`+/~77s11WId!!&" \>$kE&vM+}S1‰_=†[:†\;‡];bAcAŠ_=T1|Q.yN+ˆ\:„X5|P-€T1ƒW4Œ`=a>‰]:dBc@‘eBŠ^;S0|P-{O,‰\9|P-{N+ƒV2‰[6”d?›kE—e>¤qIŸkC¬xOŸkB’^5’^5’^5›g>¤pG‹W.–b9˜d; lC¥qHžjA¥rI™f>¨vNkDngblfalf`jd_ga]f`[20. {S3”fB`=•gC`;šlG‘c?Š^:T1 @*ƒW5{O,vJ'ƒV3ˆ[7—iD”e@nH–e?¡pI¤rJ›iA’_7–c:]5”b;Ž]6†V0‡X4…X4’eB‹_=‘dAŽ`<˜jEškG‘b=ˆY4‰Z6‚S.Œ^:‰\8ƒU0†W2‹]7™jE–gA—hB—hBœmH™kF’eA‡Y5†W2…U/˜hA“a:Ž[3–c:›g>¥qH§sJ¢nE¬xO¨tK¬xO¢nE”`7‘]4‘]4¡mD•a8ŽZ1•a8šf=¢nE¤qH”c<‘dA~U5D?,ƒi–¥x–¥xbjL +ÇÆÆ©©©ÈÈÈÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÏÏÏ®®®š•‘zV9Y;# +) *MØÞÀ¥tNr"=kv˜Db~<~—YVy8Ut'_Of@  X""‰55‹77b'' 4%3"5#6"9&<(E1"C0 =*B.:'L1_?%„\=hIhIˆ_@{S3pH(yQ1{S3eEyV:hG-„\\3“_6°|S²~UÅ‘hº†]žjAi@™e<’^5º†]·ƒZ¨uL¡nG•c<…W2‡‡‡ŒŒŒˆˆˆˆˆˆ‰‰‰20.|N*œpKŸrN—jGˆ[7ˆ[8‰\9wL)pM1)˜mL}R0ƒX6‚V4}Q.“eA¤uQŸpK‘a;˜g@‘_8[3›h@¬yP»ˆ_¶„\–d=•d>Ž^9‹\7Ž`;£uP rM•e@mGŽ]7‹Z2“a;¦uMµƒ\°XlE“b;ŒZ3”b;™g@°~WªyQžlE§vO’a:‹Z3‘`9¥tM´‚[·…]­zRŸkC‘]4i@ŸkB·ƒZ²~U¥qH«wNœh?’^5—c:°|S·ƒZÁd·ƒZ£oFšf=›g>˜d;¶‚Z©xR’eA†\<80!ƒi–¥x–¥xZ`FÇÇÆ©©©ÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÏÏÏ­­­”Œ35!.+L’w¢‡'Tg€T›i•Y"WY–b9•a8•a8ŸkBi@™e=xL)R6  +GGG¼¼¼¸¸¸²²²µµµ´´´2/,zL)ƒV3„X5…Y6zO+hD(2\:4"!0 +uN1gE* I4xL)‚V3†Y5Ž_;‡W2Œ\6Œ[4†T,“`7jA™e<›g?˜e=“`9‡U.‘`9\5Ž]6‘`9ŒZ3–d=—e=ŠW/‘]5jAžkB—c;šf>–b:ˆU,ŸlC’^5•a8“_6]4ŸlC•a9’^6\4šg>¡nEšf= lC˜d;Y0¤pG•a8šf=’^5šf=—c:™e<’^5‘]4™e< lCŸkB§sJšf=’^5i@˜d;œh@^7†X4sI(VQ9ƒi–¥x–¥x{‚^ ÇÇƪªªÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÎÎά¬¬“Œ .žjA£oF¤pG«wN¦rIfD+ I4"Z>)»»»···²²²´´´´´´30-`=Žb?”iFa?—lJxU: Hk?  V=)™kG¢sM§wQ oH¡nGjBjA—c:¢nEi@¢nE¢oF£pG¨uM¬yQ®{S¯|S°}T±}TªvMŸkBžjAœh? lC›g>¤pG¢nE¥qH­yP¯{R¯{R°|S°|S¬xO¬xO¢nEšf=ŸkBœh?–b9¡mDªvM¥qH«wN®zQ®zQµX±}TªvMªvM¤pG—c:žjA +*S8$—iE©vM§vO¢sO–kH8=-ƒi–¥x–¥x|ƒ^ +···«««ÉÉÉÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÎÎά¬¬Œ‰2! +4D +fzU'Ty“mBwd”-E{n’RN0N…JpRR%Bkk†Jcx=;  M3°°°ÎÎÎðððùùùþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿???ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvO/~R.Š^:qN31!(gF,·ƒZªvM©uL¬xO«wN¯{R—c:gF, Y9 ›jBŸnGšiC¼¼¼···³³³µµµµµµ31/‚V3‰^;ƒX6/"# 4M(Bc5   +1J&  ‡Z6ˆZ5oI™iC_8^5ªxP­{S mF nG¨vO mF˜f>™g?šh@—e=ŠX1¥sL mF™g?•c;œjB®|T¥sL¢oH¡nG¥sLœjB¡nG›iA•c;‹Y2£pI¦tM¤qJ“a9“a9³Y§uN£pIœjB§uN¡oHžlEœjB–c<’`8¡nF¬yPŸkC™f=ŸkB¼ˆ_©uL¦rI—iElL2&2"qK-†V1‹^; šž}CI5 +]@)653žžžÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÎÎά¬¬~zw "@­–¦´ŸEn3‰£}2iFSyAˆšŠ£A|f–.˜®tLs)wˆYNk') ]A*»»»ÓÓÓïïïøøøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿???ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿÿ~V6™nL—iD“b;œi@„W2\B-0#¨wP±}T¯{R­yP­yPŽdB(–e?µYŸnF_8’a:¿¿¿ººº¶¶¶¸¸¸···30.’fB‹`=V4.!;W3Hk@ *- 2K+%'?'j—dDg=S8#–iF—iE^:™iE‘b=šjE¤uP®Z¢tOœnJ’d@˜iE“eA•gBa<šlHžpK’c?‘b>‰Z6›mI¢tPª{WoJžpK—iD•gB—iD˜iE_:šlHŸqL’d@‹]9‡Y4šlH¢sO©zV¡rNŸqLšlH–hCœmI›mHŠ\7™jEªzTœkE•c<™g?jB·ƒZ¿‹b³V¯{R¬xO°|S±}T~T31!K5%”fBƒW4€V5xX.$‚^BvT8'%$“““ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÎÎά¬¬RPNAVCOkCr‹TLq$Ž§ƒ3kI[‹5_€PCu-F=tƒ¡_Z:ºÄ“‰‚F!7 + I3#¿¿¿ÔÔÔîîîøøøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯OOOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿÿ„]?‚X7b>lE°}TµX²~UšlH6%bA·ƒZ°|S˜kG,šiB³VjAŸnF¡pI¦uNÀÀÀ¼¼¼¹¹¹»»»¸¸¸41/šmJ‘eBŽdB~T3]A+Fk9;X2 +c’WOuF  ‘fD‡[8b>“fB”gBƒ[<•jI˜kH–jG‡\:‰^=˜nL’gF”jH…[9”jHˆ]<ƒX7Š`>Š`>ŽdB“iGeC”jHbAˆ]<—mKˆ]<’gF†\:–kJŽcB†\:Š`>…[9‘fEfDfD“iGfD‰^=–kJˆ]<‘fEˆ^<’gF{V:…[9•fB•e@ªyR¬zR°}T²~UªvM·ƒZ«wN°|S«wN¨tK®|SsN1/ ‹`>™lI–jH‹bB€Z=uQ4)'$“““ÊÊÊÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÎÎά¬¬…~* 9V-Ci 2\†¢v3gW‹(J‚B}lš:b‘-BxŸ´tQv1]~/u{XDK 2!ÁÁÁÔÔÔíííøøøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿÿÿoJ,zP0c@–e>—c;—c:—c:žjA“b<)‘`:\3:&sH'\3i@™f>lD˜g@˜g@ÀÀÀ¼¼¼¹¹¹»»»¸¸¸30-~P-zN,uM-?)4M'&9Pw=  +%7#MrD *wM+~R/‡Z7‹^:|O,Œ`=Œ^:”d>^7[3žjA˜d;•a8’^5˜d;ŒX/‘]4™f>•c;vQ47%Š\7…W3}R0xP1rL.*'&”””ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÎÎÎnnn YURkJ0`C, "D¶ž—}yšRµÅ¢—dƒ4:tL€¡aÂÑš ´‚“šxŒ˜j.N .'!ZA.R6 ÇÇÇ×××ïïïøøøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÿÿzU8‡^>—jGšjD®{R”`7i@™e<ŸkBbA)uK)8$—c:³V¯{R©vM¤rK›iC oHÀÀÀ¼¼¼¹¹¹»»»¸¸¸30-S/Š];    ' +$ + +;X2,B(^J sK+ŽcBc@•hE‹_<‡\9ðððñññóóóóóóôôôôôôõõõõõõööööööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿdCdA£tOŽ]6•b:›g>§sJi@‡S*™e<—c:¬xO¬xO©vM©wOcD+I3"‰X3Š\8{Q0yQ1,*(•••ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÏÏÏ^^^E?9mK0nL2 EvˆnNmˆ];ˆ_?ðððñññóóóóóóôôôôôôõõõõõõööööööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxR4ŠaA“gD“c> mF£oF¡mD¡mD”`7–b9ŽZ1i@i@œh?©uL¯{R¡pJ(•d>Œ_<V5.+)–––ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÏÏÏcccE<5b?#X9!Ug.%> B-PaQ:p‰KhyESg<%Np‡fºÃ¶XrM'%%' ]<"OOO!!!ÏÏÏóóóúúúþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???ðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿYYYîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ïïïiD'vL*†Y4]6•c:•b9’_6‘^5“`7…R)L#, Ž[2\3•b9’`8Œ[4Ž]7^8¿¿¿»»»···¸¸¸···0-,{N*T2|Q0J/    Ch>'"6 E,zO-|Q.}R.|R1vO/ðððñññóóóóóóôôôôôôõõõõõõööööööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiF)rK,€V4„V1Ž\4‘^5‡T+N%ŠW.{GŽ[2]4“`7\3—d;”a8—d;I0U7}P-wN-,*(–––ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýñññàààÏÏÏbbbI@9nL1sO4$ R t_F¹Ä´²¾­–¢‘œ†?/ gH/fE+lK0iH.hG-8''...ÒÒÒõõõûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???œœœðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ///zT5Ša?‹];“b>mFŸnG¡pI¥tM©xQ¢qJlE EEE···³³³¯¯¯°°°¯¯¯2/-’hFˆ^=‡^= /sM1 7&'?\9I1%*ŒbA‡\;Ša?|S4vP3ðððòòòóóóóóóôôôôôôõõõõõõööööööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfE+uP3„[;Žb?£tN§vO¥tM¢qJ™gA¥tM¤sL¦uN›jD£rK™gA™gAlE€X9/ ŽdBŠbB-+)•••ËËËÙÙÙëëëúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýòòòáááÑÑÑdddJB;€]B|Y=ƒ_CY@,@. V?-*079S E@ Sf$#0 iL6tUxV;|[?~\BvU:[A+ÔÔÔ÷÷÷ûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???‚‚‚ñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???³³³¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿kM6ˆaC“jI•iG¦yU£uP¯\¦wR›lG¥vQnI”e@‰Z5?-|X=ª{V¢sN§yU˜kG¤wTƒ^BŽŽŽ¯¯¯¬¬¬¨¨¨©©©¨¨¨0.+fD–mMŠaB ‡`@ŽgH‡aCqS;„_B\A- zU9oI,**eE™pO’jIhJ‚]Añññòòòóóóóóóôôôôôôõõõõõõööööööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrR8€\@fGrQoK˜iD™jE—hC‹\7©zU©zU§xS¤uP¨yT¡rM­~Y¦wR­[ ‡^>ŠcD,)'•••ÍÍÍÚÚÚìììúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýôôôåååÖÖÖfffPF>}Y<~Y=~Y<}X:|X;vS7M5# (? + #6$$R;)kL2vU:wT8uQ6zW:wS7uR6xT9L5#/"  1$   +      2#cB(‰aAtR˜kI•gDžpK—iDª{W¦xS¢tP¢sO rM’d@S<)<'žpK¢tP¨{W˜kH—jG™mJ444®®®®®®«««¨¨¨©©©¨¨¨1.,yO.‡^>bE/$†^>‡`Aƒ]>„]@€[=lN91#{U8pI,„^?rJ+\?‘fFfF‡`@~Y;òòòòòòóóóóóóôôôôôôõõõõõõööööööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvT:vR4ŽgG‡];¡tPfGškG rM¢sOžpKŠ[7ŸqL rM­Z rM™jFŸqL–hD)gI3ŒdE.+)™™™ÒÒÒßßßïïïûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþõõõèèèÜÜÜkkk.,,VQLUOKVQNVQMTOKPLHOJG + @=:EB>1.+-*(IDBLGDNIFPLHRMIROJSOKTOKSNIOKHMIEKFCIFBIEAIEAIEAIEAIDBIDBIEAHDAHEAJFBIEAIDAHDAHCAHDAIDBIEBJFBIEBJFBJFBJFCIEBJFBJFCJFBJFBIFBLGDNJFRMITOKga\f`\c^Ye_[d^Yiiiiiigggfffffffff_ZV^XT_YU]XTZUQVRM PKGUPMXTO_YUd_[\VRŸŸŸÙÙÙãããñññûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ÷÷÷ìììâââooo¥¥¥ßßßèèèôôôüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþùùùñññèèèâââÞÞÞØØØÑÑÑÌÌÌÌÌÌÌÌÌËËËÉÉÉÃÃÿ¿¿»»»¶¶¶²²²±±±±±±³³³´´´¶¶¶»»»ÀÀÀÅÅÅÊÊÊÍÍÍÏÏÏÏÏÏÏÏÏÍÍÍËËËÉÉÉÆÆÆÃÃÃÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÊÊÊÍÍÍÑÑѺºº½½½ÛÛÛßßßâââãããããããããããããããããããããããããããÕÕÕ«««ããããããâââàààßßßßßßßßßßßßßßßÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚØØØÖÖÖ¬¬¬¸¸¸ÑÑÑÏÏÏÍÍÍËËËÊÊÊÉÉÉÉÉÉÊÊÊÊÊÊËËËÌÌÌÏÏÏÄÄĬ¬¬ÕÕÕÖÖÖÒÒÒÌÌÌÆÆÆ»»»´´´¬¬¬©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©¬¬¬´´´»»»ÃÃÃËËËÒÒÒÚÚÚááá¹¹¹ÕÕÕãããããããããããããããããããããããããããããããããâââÃÃñ±±ÕÕÕÖÖÖÙÙÙÝÝÝàààåååíííöööýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûõõõîîîéééæææàààÛÛÛÖÖÖÔÔÔÓÓÓÒÒÒÏÏÏËËËÈÈÈÄÄÄÁÁÁ½½½¼¼¼¼¼¼¾¾¾¿¿¿ÂÂÂÆÆÆÊÊÊÎÎÎÒÒÒÔÔÔØØØÙÙÙÚÚÚÙÙÙØØØ×××ÖÖÖÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××ØØØÚÚÚÛÛÛÜÜÜßßßáááâââããããããããããããããããããããããããããããããããããããããããããâââááááááááááááááááááàààßßßßßßßßßÝÝÝÜÜÜÚÚÚÙÙÙ×××ÖÖÖÔÔÔÓÓÓÑÑÑÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÑÑÑÒÒÒÓÓÓÔÔÔÖÖÖØØØÙÙÙÕÕÕÒÒÒÐÐÐËËËÇÇǼ¼¼ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº¼¼¼ÂÂÂÇÇÇÌÌÌÒÒÒ×××ÜÜÜáááãããããããããããããããããããããããããããããããããããããããâââàààÝÝÝÜÜÜÝÝÝàààäääèèèìììòòòøøøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýøøøôôôñññîîîéééåååâââàààÞÞÞÝÝÝÙÙÙÕÕÕÔÔÔÑÑÑÍÍÍËËËÊÊÊËËËËËËÌÌÌÏÏÏÒÒÒÕÕÕÙÙÙÛÛÛÝÝÝàààãããäääåååääääääãããââââââââââââââââââââââââââââââââââââââââââââââââââââââãããããããããããããããããããããããããããäääääääääåååååååååæææææææææææææææææææææææææææææææææææææææææææææææææææååååååååååååååååååååååååäääããããããáááàààßßßÝÝÝÝÝÝÜÜÜÚÚÚÙÙÙØØØ×××××××××ØØØÙÙÙÚÚÚÚÚÚÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÜÜÜÚÚÚØØØÕÕÕÒÒÒÏÏÏÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÏÏÏÓÓÓÖÖÖÙÙÙÝÝÝßßßâââåååææææææææææææææææææææææææææææææææææææææææææåååääääääæææéééìììïïïòòò÷÷÷ûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýûûûùùù÷÷÷õõõôôôñññðððïïïìììêêêèèèæææäääâââààààààààààààáááâââåååçççêêêëëëíííðððñññòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòñññññññññññññññññññññññññññððððððïïïïïïîîîììììììëëëëëëêêêéééèèèèèèèèèéééêêêêêêêêêëëëëëëíííîîîïïïîîîîîîîîîíííëëëêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêëëëìììíííîîîðððññññññòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòñññññññññòòòôôôöööøøøúúúûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýýýýýýýýýýýýüüüûûûùùùøøø÷÷÷öööõõõôôôôôôôôôôôôôôôõõõöööøøøùùùúúúûûûüüüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýüüüûûûûûûúúúúúúùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùúúúúúúûûûüüüüüüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýýýýýýýýýýüüüüüüüüüüüüüüüýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream.rgba b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream.rgba new file mode 100644 index 00000000..e63b0db8 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream.rgba @@ -0,0 +1,67 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûûûÿúúúÿøøøÿ÷÷÷ÿöööÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿ÷÷÷ÿøøøÿùùùÿúúúÿûûûÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿ÷÷÷ÿôôôÿðððÿìììÿéééÿæææÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿäääÿäääÿäääÿäääÿäääÿäääÿäääÿäääÿäääÿäääÿäääÿäääÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿèèèÿëëëÿïïïÿòòòÿõõõÿùùùÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿöööÿñññÿëëëÿåååÿßßßÿÚÚÚÿÕÕÕÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÒÒÒÿÑÑÑÿÑÑÑÿÏÏÏÿÎÎÎÿÎÎÎÿÍÍÍÿÍÍÍÿÍÍÍÿÎÎÎÿÎÎÎÿÎÎÎÿÎÎÎÿÏÏÏÿÏÏÏÿÑÑÑÿÒÒÒÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÒÒÒÿÒÒÒÿÑÑÑÿÐÐÐÿÏÏÏÿÏÏÏÿÎÎÎÿÏÏÏÿÏÏÏÿÐÐÐÿÑÑÑÿÑÑÑÿÒÒÒÿÒÒÒÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÔÔÔÿØØØÿÝÝÝÿãããÿèèèÿîîîÿôôôÿúúúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿòòòÿêêêÿÈÈÈÿ¦¦¦ÿ   ÿœœœÿ–––ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ“““ÿ’’’ÿ’’’ÿ‘‘‘ÿÿÿŽŽŽÿŒŒŒÿ‹‹‹ÿŠŠŠÿŠŠŠÿŠŠŠÿ‹‹‹ÿ‹‹‹ÿŒŒŒÿÿŽŽŽÿÿ’’’ÿ“““ÿ”””ÿ•••ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ–––ÿ———ÿ———ÿ———ÿ———ÿ–––ÿ•••ÿ”””ÿ”””ÿ“““ÿ’’’ÿ’’’ÿ‘‘‘ÿ‘‘‘ÿ‘‘‘ÿ‘‘‘ÿ‘‘‘ÿ‘‘‘ÿ‘‘‘ÿ‘‘‘ÿ‘‘‘ÿ’’’ÿ’’’ÿ“““ÿ”””ÿ”””ÿ•••ÿ–––ÿ———ÿ———ÿ———ÿ———ÿ———ÿ–––ÿ–––ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ–––ÿ–––ÿ•••ÿ•••ÿ”””ÿ”””ÿ”””ÿ”””ÿ”””ÿ”””ÿ•••ÿ•••ÿ–––ÿ–––ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ–––ÿ–––ÿ–––ÿ–––ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ•••ÿ–––ÿ–––ÿ–––ÿ–––ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ•••ÿ”””ÿ’’’ÿ‘‘‘ÿÿŽŽŽÿŒŒŒÿ‹‹‹ÿŒŒŒÿÿÿÿ’’’ÿ”””ÿ•••ÿ–––ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ———ÿ–––ÿ–––ÿ–––ÿ™™™ÿŸŸŸÿ¤¤¤ÿÓÓÓÿçççÿïïïÿ÷÷÷ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿøøøÿîîîÿäääÿoooÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£££ÿàààÿêêêÿõõõÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿöööÿêêêÿÞÞÞÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžžžÿÚÚÚÿåååÿòòòÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿôôôÿæææÿØØØÿgggÿÿÿÿ'%#ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#" ÿ$" ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(&$ÿ*'%ÿ*(&ÿ+(&ÿ,)'ÿ*('ÿ)'%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ&$#ÿ(%#ÿ*'%ÿ+(&ÿ+(&ÿ,)'ÿ ÿ///ÿ///ÿ...ÿ...ÿ...ÿ///ÿ ÿ+(&ÿ+)'ÿ)'&ÿ)&%ÿ)&$ÿ'$"ÿ&#!ÿ$" ÿ%"!ÿ#!ÿ#! ÿ# ÿ$" ÿ%"!ÿ&$"ÿ(%#ÿ)'%ÿ*(&ÿ,)(ÿ-*(ÿ-*(ÿ-*(ÿ-+)ÿ-+)ÿ.+)ÿ,*(ÿ*)'ÿ*(&ÿ$" ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(&$ÿ(&$ÿ*(&ÿ+)&ÿ-*(ÿ-+)ÿ,*(ÿ-+)ÿ-*(ÿ,*(ÿ+(&ÿ)&%ÿ'&$ÿÿÿÿÿÿÿÿÿÿ'$#ÿ(&$ÿ*(&ÿ+(&ÿ,)'ÿ-+)ÿ-+)ÿ.+)ÿ-*(ÿ,)'ÿ,)'ÿ,*(ÿ+('ÿ)'%ÿ'%#ÿ ÿÿÿ™™™ÿÓÓÓÿàààÿïïïÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿóóóÿâââÿÓÓÓÿdddÿÿÿJA:ÿnM3ÿÿÿÿÿÿþþþÿúúúÿõõõÿñññÿìììÿæææÿàààÿÚÚÚÿÔÔÔÿÎÎÎÿ£££ÿVVVÿÿÿÿ ÿÿ¸¸¸ÿÖÖÖÿÜÜÜÿãããÿéééÿÿT6ÿZ:!ÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿjG,ÿqM0ÿ[=ÿ|U6ÿd<ÿf?!ÿ`;ÿÿ8)0ÿ8)0ÿ8)0ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ8*1ÿ=/5ÿÿmK1ÿwT8ÿuQ4ÿxR4ÿ†`AÿqJ+ÿ///ÿ™™™ÿ™™™ÿ˜˜˜ÿ–––ÿ™™™ÿ™™™ÿ,)'ÿpH)ÿ|U8ÿZ<ÿzU8ÿsO3ÿvT8ÿÿÿÿÿÿÿÿÿÿeB'ÿpK/ÿƒ\?ÿ„]>ÿ~V5ÿ‡_>ÿtK+ÿmD$ÿnE%ÿX8ÿƒ[;ÿtL-ÿa:ÿ3!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿnK0ÿjF)ÿhC%ÿsK-ÿ‚Z:ÿ‰`@ÿX8ÿh?ÿpG'ÿkD#ÿnG(ÿqL/ÿuR7ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿV4ÿ]:ÿ`;ÿpI*ÿxO/ÿ‡^>ÿgGÿZ9ÿ|T4ÿ„]>ÿoH)ÿqK,ÿkE)ÿuR6ÿmJ/ÿ%#!ÿÿÿ”””ÿÍÍÍÿÜÜÜÿîîîÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿòòòÿàààÿÐÐÐÿcccÿÿÿH>7ÿiG.ÿÿÿÿÿÿýýýÿøøøÿóóóÿíííÿçççÿàààÿÚÚÚÿ’’’ÿZZZÿÿÿÿÿÿÿ%%%ÿ'''ÿ ÿ¹¹¹ÿÙÙÙÿàààÿèèèÿÿbF-ÿ\<#ÿ1 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfC(ÿ‚^AÿhIÿ’iIÿŽeEÿ|T5ÿwS5ÿÿ5'.ÿ5'.ÿ5'.ÿ5'.ÿ5'.ÿ5'.ÿ5'.ÿ5'.ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ:-3ÿÿjI/ÿvR7ÿwR5ÿzT6ÿuM.ÿmD$ÿ000ÿŸŸŸÿŸŸŸÿœœœÿ›››ÿžžžÿŸŸŸÿ.+)ÿtL,ÿ~W8ÿzT7ÿ\@ÿWC3ÿT8#ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿgD(ÿsN2ÿ{U6ÿ‚Y8ÿ~T2ÿ…[9ÿ|R0ÿ…[9ÿcAÿ˜mLÿ˜nLÿ’iIÿsL-ÿ;(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ÿmJ/ÿiE(ÿqJ-ÿyQ1ÿ–kKÿ£xVÿ—mKÿcAÿ†[:ÿ…[:ÿtL,ÿoI,ÿuR6ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿtS9ÿqL0ÿ{U7ÿsJ+ÿuJ(ÿŒa?ÿgEÿ‰_>ÿ…\<ÿsL,ÿkC%ÿsL-ÿ„_Bÿ}Z?ÿxW=ÿ&$"ÿÿÿ‘‘‘ÿÊÊÊÿÙÙÙÿìììÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿcccÿÿÿKB;ÿtR7ÿÿÿÿÿÿüüüÿ÷÷÷ÿðððÿéééÿâââÿÛÛÛÿÿÿÿÿ ÿÿ,,,ÿ;;;ÿ???ÿDDDÿHHHÿ!!!ÿ555ÿØØØÿàààÿçççÿÿaC+ÿhI/ÿ2!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿiE)ÿnG)ÿyQ0ÿT2ÿzN+ÿqG'ÿqI*ÿÿ7)0ÿ7)0ÿ7)0ÿ7)0ÿ7)0ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ5'.ÿ5'.ÿ5'.ÿ;-4ÿÿmK1ÿ|X;ÿƒ\>ÿ…]=ÿŽdBÿ{R1ÿÿ   ÿ«««ÿ¨¨¨ÿ§§§ÿ©©©ÿ«««ÿ2/-ÿ†\9ÿˆ^<ÿ‹cBÿS;(ÿÿ ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿrN1ÿxQ3ÿŒcCÿ•jHÿšmIÿ˜jFÿa=ÿ‹]8ÿ‰[6ÿƒU0ÿƒU1ÿ†Z8ÿuL+ÿ3 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿoK/ÿvO1ÿ‚Y8ÿ~S1ÿ‡Z6ÿŒ]9ÿ‰[6ÿS.ÿ}N*ÿŠ]:ÿŒa?ÿ€W8ÿ|W:ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿ`>"ÿfA#ÿsK*ÿŠ_<ÿŽa=ÿ™kFÿ™lHÿ•iGÿŠ`>ÿˆ_>ÿzQ1ÿ"ÿ'ÿc@%ÿcA'ÿ$#!ÿÿÿ‘‘‘ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿdddÿÿÿE<5ÿa="ÿÿþþþÿûûûÿõõõÿîîîÿæææÿßßßÿlllÿ ÿÿÿ444ÿ<<<ÿAAAÿEEEÿIIIÿNNNÿRRRÿWWWÿOOOÿÿ±±±ÿàààÿçççÿÿU7ÿO0ÿ+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿb=!ÿe>ÿlB ÿŠ]8ÿ†W1ÿxK(ÿsI)ÿÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ6(/ÿ + ÿÿÿÿÿÿÿÿÿÿEEEÿ¸¸¸ÿ´´´ÿ³³³ÿ¶¶¶ÿ¸¸¸ÿ41.ÿxI$ÿwI&ÿpD#ÿoF'ÿ ÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿ^9ÿnF&ÿqF#ÿ‚S.ÿ‡U/ÿxFÿ„R+ÿˆV/ÿˆV/ÿƒQ*ÿ…T-ÿxJ%ÿrF$ÿ6!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`;ÿlD%ÿwL+ÿ|M)ÿƒR,ÿ€O(ÿ—e>ÿŽ\5ÿ„R+ÿˆW1ÿxK&ÿqF$ÿg?!ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿgB&ÿkC$ÿxM*ÿ~O*ÿP)ÿ€O'ÿQ*ÿ€P,ÿ{N+ÿtI'ÿC:+ÿ¡¦ƒÿdgPÿV3ÿ`>$ÿ&#!ÿÿÿ’’’ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿnnnÿÿÿ^YTÿhE(ÿÿþþþÿûûûÿõõõÿíííÿåååÿÝÝÝÿ666ÿ***ÿ>>>ÿBBBÿGGGÿKKKÿOOOÿSSSÿWWWÿOOOÿ666ÿÿÿÿˆˆˆÿàààÿçççÿÿ^A*ÿiJ2ÿ4$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ÿnJ.ÿ‰aBÿ–kHÿœmHÿ¡qJÿ›mGÿ‘fCÿÿ8)0ÿ8)0ÿ8)0ÿ8)0ÿ6(/ÿ7(/ÿ8)0ÿ8)0ÿ7)0ÿ7)0ÿ8)0ÿ8*1ÿ9*1ÿÿ=/5ÿÿyT6ÿƒ[:ÿT2ÿ‘d@ÿžnHÿ›jDÿÿÿ¿¿¿ÿ¼¼¼ÿ¹¹¹ÿ½½½ÿ¿¿¿ÿ742ÿ”e>ÿ—hDÿb?ÿ{Q1ÿ>+ÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿwR4ÿŠa@ÿd@ÿŽ^7ÿ mEÿ¯|Sÿšg>ÿ•b9ÿ¬yPÿ³Wÿ«yPÿškEÿ‘eAÿB-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ÿ}X:ÿ|T4ÿ†Z7ÿ‘b<ÿ¬zRÿ¯|Sÿ§tKÿ­zQÿ­zQÿ¤rIÿ¦vPÿa=ÿ‚Y8ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿ€Z;ÿ‹a@ÿ–iEÿ¥uNÿ–c;ÿ£qHÿ›jBÿŠ[5ÿ“fCÿmYAÿ‘—zÿŠ’sÿŠ’sÿeiUÿ;*ÿ=<<ÿÿÿ¦¦¦ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿÿÿÿvqmÿxU8ÿÿþþþÿûûûÿôôôÿìììÿåååÿÝÝÝÿ666ÿ555ÿLLLÿPPPÿTTTÿYYYÿKKKÿ***ÿÿÿÿÿ ÿOOOÿ±±±ÿàààÿèèèÿÿ`C,ÿeH0ÿ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿwT8ÿ…]>ÿšoMÿ—gBÿŸmFÿ¦vPÿ›nJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ}U5ÿdBÿ—jFÿ_;ÿ¢rLÿ¥tMÿÿÿÀÀÀÿ¼¼¼ÿ»»»ÿ¿¿¿ÿÀÀÀÿ963ÿ›kDÿ`:ÿ•iEÿŒcBÿmH,ÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿ€Y:ÿ~T2ÿ›mIÿ§vOÿ–b:ÿ±}Tÿ§sJÿ«wNÿ±}Tÿ·ƒZÿ·„[ÿ–e>ÿ™kGÿF1 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ~X:ÿŽdCÿ”gCÿ pJÿ²Wÿº†]ÿ§sJÿ©uLÿ²~Uÿ«xOÿ¬zTÿ‘c>ÿ‘fDÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿƒZ:ÿ—kIÿŸqLÿ°~Wÿ¡nEÿ§tKÿ¦tLÿœmHÿŠ^;ÿ|r]ÿÛÞ½ÿäèÅÿäèÅÿÊȬÿ ÿ¸··ÿÿÿ¬¬¬ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¦¡ÿtP4ÿÿþþþÿûûûÿôôôÿìììÿåååÿÝÝÝÿ666ÿ@@@ÿZZZÿ@@@ÿ%%%ÿ ÿÿÿÿÿRRRÿ“““ÿÊÊÊÿÑÑÑÿÙÙÙÿáááÿèèèÿÿeI1ÿgH1ÿ6&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿzW;ÿ„\=ÿ’gDÿ£uPÿ¬|Uÿ¡qJÿ›mIÿ˜lJÿŠbBÿƒ]>ÿqL0ÿsP4ÿwU:ÿwU:ÿ;)ÿ:(ÿsQ6ÿrP5ÿxU;ÿ{Y>ÿrP5ÿ4$ÿdG1ÿ‰aAÿ“iGÿ`=ÿ–iDÿ§xSÿ«{Tÿ¬{UÿÿÿÀÀÀÿ¼¼¼ÿ»»»ÿ¿¿¿ÿÀÀÀÿ963ÿ§wPÿª{Uÿ‘d@ÿ‰`>ÿ‹cDÿ1"ÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿöööÿôôôÿÿŠaAÿ›oLÿœmHÿ£qJÿ²Vÿ¹…\ÿ²~Uÿ·ƒZÿ¶‚Yÿ²~Uÿ²Vÿ­|Uÿ¥vRÿG1 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"ÿgGÿ”hFÿ¨zVÿ®}Wÿ´€Xÿ´€Wÿ¹…\ÿ·ƒZÿ­yPÿ³€Wÿ®|Uÿ¥vQÿšmJÿÿÿÿÿÿÿÿÿÿ—mKÿ—jGÿ qKÿ°~Wÿ±~Uÿ²VÿšiBÿškGÿ–lJÿ__SÿÒÓ¶ÿäèÅÿäèÅÿÌÈ­ÿ ÿÈÇÇÿÿÿ«««ÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¥¡ÿsN3ÿÿþþþÿûûûÿôôôÿíííÿåååÿÞÞÞÿ666ÿÿÿÿÿÿ ÿBBBÿ{{{ÿ¸¸¸ÿ¿¿¿ÿÇÇÇÿÎÎÎÿÖÖÖÿÝÝÝÿãããÿêêêÿÿP2ÿY9!ÿ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿkI-ÿjD%ÿvL,ÿ‡Y6ÿŠ[7ÿŠ\8ÿyN,ÿoF'ÿ:'ÿ#ÿtO3ÿuP3ÿrK.ÿvP2ÿyS5ÿyS5ÿjD&ÿjD&ÿtN0ÿnG)ÿsL.ÿY9 ÿ2 ÿƒX6ÿˆ[8ÿ”fAÿ˜iCÿ]8ÿ”d>ÿ¡pIÿÿÿÀÀÀÿ¼¼¼ÿ»»»ÿ¿¿¿ÿÀÀÀÿ631ÿ“b;ÿ“c<ÿ•gCÿ‹`>ÿyQ0ÿO6!ÿÿÿÿÿÿÿÿÿ*ÿ€U3ÿ‡Z6ÿ›kFÿ¢oHÿ mDÿªvMÿ¤pGÿªvMÿšf=ÿY0ÿ•b9ÿ]6ÿ™jDÿvN/ÿZ9ÿZ;#ÿT7 ÿV;%ÿT:%ÿQ8#ÿS:%ÿP6"ÿT;&ÿL3ÿD*ÿJ1ÿH/ÿO5!ÿM4ÿF-ÿI/ÿK1ÿR7"ÿ[?(ÿhG-ÿ†\:ÿ‹^;ÿ›lGÿ—f?ÿY1ÿ—c:ÿ™e<ÿœh?ÿ¡mDÿ]4ÿ‹Y2ÿ`:ÿŒ^9ÿŽb?ÿ†\:ÿ~U5ÿxR3ÿzU7ÿuP3ÿnG(ÿtL+ÿV5ÿ„W4ÿ_:ÿ‰X2ÿ‹Y1ÿžjAÿœh@ÿœkEÿ’d@ÿU4ÿ'$ÿ”œ{ÿ°»‘ÿ°»‘ÿ`aOÿ+ÿÇÇÆÿÿÿªªªÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¦¡ÿZ>ÿÿþþþÿûûûÿõõõÿîîîÿæææÿàààÿDDDÿÿÿ???ÿzzzÿ¦¦¦ÿ¸¸¸ÿ¸¸¸ÿ»»»ÿÁÁÁÿÈÈÈÿÎÎÎÿÕÕÕÿÜÜÜÿâââÿèèèÿíííÿÿ]>$ÿpN5ÿ7'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ÿM4!ÿO4 ÿ[>'ÿN7%ÿK6&ÿ,ÿÿÿ3ÿÿ~Z=ÿ„]>ÿ‰`@ÿ{R1ÿ}S2ÿ€V5ÿ~T3ÿ€V5ÿfEÿ—mLÿ”jIÿxM+ÿ)ÿŠ`>ÿ›lGÿ£sMÿ§wPÿ¢rLÿ`9ÿ—f?ÿÿÿÀÀÀÿ¼¼¼ÿ»»»ÿ¿¿¿ÿÀÀÀÿ741ÿlEÿ¥uNÿ™kEÿ›nKÿdCÿtL-ÿ ÿÿH0ÿcB(ÿpO4ÿ}[?ÿ‰cEÿV6ÿ}Q0ÿ“fCÿnIÿ£rKÿ±Wÿ­yPÿ›g>ÿŸkBÿœh?ÿœh?ÿœh?ÿ©vMÿ±~Wÿ²[ÿ™jFÿ„W3ÿ‘fDÿ‰`@ÿŠcDÿ‡`Bÿ|W9ÿvP2ÿrL.ÿoJ,ÿqK-ÿlG)ÿ{U7ÿ‚]?ÿŒfHÿ~X:ÿoJ,ÿ[=ÿ~X:ÿ‹dEÿgGÿeDÿdAÿ‹]9ÿ`:ÿœjCÿ–c:ÿªvMÿ´€WÿÀŒcÿ´€Wÿ“_6ÿ©vNÿ¢qJÿ¦vQÿ¢tPÿ™lIÿ‘eCÿ{Q0ÿ~U4ÿ‚X8ÿ€V4ÿ‹_=ÿœoKÿª{Wÿ§wRÿˆW0ÿ¡nFÿ©uLÿ¬yQÿªySÿ›nJÿŠaAÿ]XJÿÛÞ½ÿäèÅÿäèÅÿ¸¹ ÿ ÿÇÇÆÿÿÿªªªÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¥ ÿoJ,ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ÿ[9ÿ]9ÿ5#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ÿ+ÿ,ÿ, + +ÿ- ÿNÿYÿyÿ¡ÿ©ÿ†ÿ ÿlI-ÿ~W7ÿƒW4ÿ”fBÿb>ÿ—iEÿ•gCÿ™lHÿžpLÿšlHÿa=ÿ~O+ÿf?!ÿ0ÿ’a;ÿ˜f?ÿ˜f>ÿ˜g@ÿ¢qJÿ™gAÿÿÿÀÀÀÿ¼¼¼ÿ»»»ÿ¿¿¿ÿÀÀÀÿ631ÿ€O(ÿ–e>ÿ‘b<ÿ‰Z6ÿ‡[8ÿ‰_?ÿN5!ÿÿ ÿuP4ÿxT7ÿyT6ÿƒZ:ÿxM+ÿ}P,ÿyJ%ÿ”c>ÿ—e>ÿ™f>ÿŸkBÿ¬xOÿ¥qHÿ§sJÿ«wNÿ¯{Rÿ¬xOÿ¬zRÿ oHÿ‚R,ÿR-ÿvH$ÿ‡[8ÿ‚W5ÿ‚X6ÿ‚X8ÿ†\<ÿ‚X8ÿ‚X8ÿˆ_>ÿ‹a@ÿ‰`?ÿ”jIÿŠ`@ÿpF%ÿoE$ÿnD$ÿ|R1ÿ„Y7ÿˆ\:ÿc?ÿŽ`;ÿ•e?ÿžmFÿ mFÿ©uLÿ­yPÿ¹…\ÿ´€Wÿ\3ÿŠV-ÿ‹X0ÿ’_8ÿšiBÿ—gAÿ”e?ÿ‰[6ÿb>ÿ`=ÿc?ÿ•gCÿœmHÿ¥uPÿ§vPÿ’`9ÿ…S+ÿŠW/ÿ\3ÿjAÿ–e>ÿb?ÿ|S2ÿ^TEÿ®³•ÿÊÒ«ÿÊÒ«ÿŽyÿÿÇÆÆÿÿÿ©©©ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¥ œÿpJ,ÿoI+ÿzT5ÿzT5ÿsN2ÿeD)ÿ_@(ÿV9!ÿQ4ÿQ4ÿL1ÿU:%ÿM2ÿP6 ÿN4ÿM3ÿO4ÿW;&ÿY<'ÿY='ÿX;$ÿX;#ÿZ<$ÿ[;#ÿ\: ÿfB%ÿsM0ÿoH*ÿdB&ÿW:#ÿW:#ÿV9"ÿU:$ÿQ8#ÿS9%ÿL3ÿL2ÿN4 ÿK2ÿH.ÿI/ÿM4 ÿH.ÿI/ÿJ1ÿM4 ÿK3ÿ6$ÿ*ÿ¯ ÿ´,,ÿ¸76ÿ¹:9ÿ·54ÿ´,,ÿ±##ÿ­ÿ©ÿ¥ÿÿkH,ÿ}S1ÿ–gAÿŸnFÿŸnFÿšhAÿ•c<ÿšhAÿ•c<ÿŒZ3ÿ]5ÿ’_8ÿZ2ÿaA(ÿ/ÿ]7ÿ—e=ÿŸnFÿžmFÿ›jDÿÿÿ¿¿¿ÿ¼¼¼ÿ¹¹¹ÿ½½½ÿÀÀÀÿ631ÿ•d=ÿ•d=ÿ‹Z4ÿ`:ÿ‹^9ÿŠ_=ÿ†\<ÿ +ÿÿiF,ÿqJ+ÿpH(ÿ{Q0ÿ€S/ÿŠZ5ÿŽ^8ÿ™g@ÿ”b:ÿšf>ÿ™e<ÿ¨tKÿ§sJÿ¦rIÿŸkBÿ¡mDÿšf=ÿ]5ÿ]5ÿ‰X0ÿ—hAÿ‰Z4ÿŽ^:ÿˆZ7ÿ…W4ÿ…Y5ÿb>ÿŽ`=ÿŽ`=ÿ‰[7ÿ…Y5ÿˆ[7ÿƒU2ÿ|P,ÿT0ÿŠ]9ÿ‚U1ÿƒU1ÿˆZ5ÿŒ]8ÿŽ_:ÿ•e?ÿšiCÿ£qJÿ—d=ÿ™f=ÿžkBÿ›g>ÿ“_6ÿ”`7ÿŸkBÿ“_6ÿ“`8ÿ•b:ÿœjBÿšhAÿ—f?ÿœkDÿ¢qKÿ”c<ÿ–e>ÿ™g@ÿ–d=ÿ]5ÿ’_6ÿ–c;ÿ\3ÿœh?ÿ–c;ÿ”c<ÿ„X4ÿ‚Y8ÿ}t`ÿÒÓ¶ÿäèÅÿäèÅÿÉÆ«ÿ +ÿÇÆÆÿÿÿ©©©ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ§¡žÿuN0ÿzS4ÿvN/ÿ„\<ÿ‡_@ÿ~Y<ÿxU:ÿmJ1ÿjI.ÿbA'ÿaA'ÿlK2ÿlL4ÿhI0ÿcD+ÿaB)ÿdD+ÿ^>$ÿmK2ÿsR7ÿuS8ÿxU:ÿrO3ÿsO3ÿrM0ÿsK,ÿ‹cCÿcCÿŠ`?ÿŠa?ÿ€W6ÿ}T4ÿsK,ÿ}W9ÿ‚]?ÿ„^Aÿ[>ÿ}X:ÿ}W9ÿsN0ÿpK-ÿ‡bDÿ~X;ÿ}X:ÿY;ÿtN0ÿoL/ÿa?%ÿÿ²('ÿ¸76ÿ¼DDÿ¼CCÿ¸98ÿ´--ÿ°""ÿ¬ÿ© ÿ¥ÿÿqM1ÿV4ÿ^7ÿ¦rIÿ¶‚Yÿ·ƒZÿ³Vÿ¯{Rÿ²~Uÿ lCÿ£oFÿ³Vÿ±}Tÿ°|SÿwS7ÿ ÿkG+ÿ’`9ÿ˜g@ÿ¥tMÿÿÿ¼¼¼ÿ¸¸¸ÿµµµÿºººÿ¼¼¼ÿ852ÿ¥tNÿ¢qKÿžmFÿ‘b;ÿa;ÿˆZ7ÿŽc@ÿI4#ÿÿ4$ÿ†]<ÿ‡]<ÿ…X4ÿ–gAÿ¬{Sÿ«yQÿ¥rJÿ¥qIÿŸkBÿ¤pGÿšf=ÿ«wNÿ³Vÿ²~Uÿ¶‚Yÿ¨tKÿ£pGÿ˜f>ÿ•c=ÿ¤tMÿ¥uOÿŸpJÿ—hCÿ“d?ÿ“d?ÿŠZ5ÿœkFÿ¢sNÿ£sNÿ¤uPÿ›kFÿ—iDÿŽ`;ÿ‰Z5ÿ£tOÿ¡qLÿžmHÿnIÿ•e@ÿ”c<ÿŒ\6ÿ pJÿ¨xQÿ¬{Tÿ«yRÿ§uNÿ©vNÿœiAÿšf>ÿ¼ˆ_ÿ®zQÿ­yPÿ®zQÿ¡nEÿŸlCÿ–c:ÿ¨uMÿ²~VÿµYÿ³€Wÿ®{Rÿ°}TÿŸkBÿ¡mDÿ¹…\ÿ­yPÿ¬xOÿ©vMÿœkEÿ†Y5ÿxO.ÿPH7ÿ¦‚ÿ°»‘ÿ°»‘ÿ~gÿÿÇÆÆÿÿÿ©©©ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ©¤ ÿ‚\=ÿY:ÿŠ`?ÿ“iFÿŒb@ÿ„\<ÿ‡aBÿƒ]@ÿ€Z<ÿ‚]?ÿ}W;ÿvR5ÿ[=ÿ{W:ÿ[>ÿ}X;ÿwQ4ÿY<ÿ‚\=ÿ„^?ÿ}W8ÿ„]>ÿ‡`@ÿ†_?ÿ‰_?ÿˆ]:ÿa?ÿ—lHÿ”gDÿ™lJÿ›nKÿŠ];ÿdCÿŒbAÿdCÿˆ^>ÿŠa@ÿŽeDÿ‹bAÿ†]<ÿ|R2ÿŒbBÿŒbBÿ‰`?ÿdCÿ”jJÿƒ[;ÿxT6ÿÿ³+*ÿ¹:9ÿ½EEÿ»??ÿ·54ÿ³))ÿ¯ÿ«ÿ§ + ÿžÿÿ[?ÿŒa?ÿžlEÿ¤pGÿ§sJÿ®zQÿ±}Tÿ³Vÿ¸„[ÿ´€Wÿ¡mDÿ¶‚YÿªvMÿ­yPÿ¬xOÿ—lKÿ ÿ(ÿaB*ÿwR5ÿÿÿ»»»ÿ¶¶¶ÿ´´´ÿ¸¸¸ÿºººÿ631ÿ¡qKÿ¦vOÿ¬{Uÿ£rKÿžmFÿ˜iCÿ–iEÿŠa@ÿÿ ÿgFÿ™mJÿ¤uQÿ¦vOÿ¤rJÿ±}Tÿ²~Uÿ·ƒZÿ¯{Rÿ©uLÿ­yPÿ´€Wÿ®zQÿ¬xOÿµXÿ²~Vÿ¬zRÿ­{Tÿ¤sLÿšjEÿ£tOÿœnIÿ¡sNÿŸpLÿ•e@ÿŸoIÿ qKÿ¢rMÿ™iDÿŸpJÿ¡rMÿšlHÿ˜jFÿ‘c>ÿ˜iDÿ¢sMÿžnIÿ¤tOÿ¦vPÿ•d?ÿžoIÿšlGÿœnJÿ™jFÿnIÿ¥uOÿ¥tMÿ¢pIÿ–d<ÿ®{Sÿ®zQÿ¬xOÿ²~Uÿ»‡^ÿ«wNÿªvMÿ¨tKÿ©uLÿ­yPÿ°|Sÿ´€Wÿ´€Wÿ®zQÿšf=ÿ¿‹bÿ¬xOÿ¬xOÿ¬yQÿ°Xÿ”gCÿ„Z:ÿ`YEÿÁǤÿÊÒ«ÿÊÒ«ÿ¤§Šÿ ÿÇÇÆÿÿÿ©©©ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¨£Ÿÿƒ\<ÿŽeDÿžrPÿ”fBÿ˜jGÿ¦zWÿžrPÿ’hFÿ’gFÿ€V4ÿ˜nMÿ‹a@ÿƒY8ÿŒcBÿŽcCÿcAÿdCÿšoMÿ‘eCÿ‘fCÿŸsRÿœqNÿqNÿ˜lIÿb?ÿ£uPÿ˜iDÿ”d@ÿoJÿ£sOÿ¢tNÿ•fAÿ¦xTÿpLÿ”gCÿ¢uQÿ¬[ÿ¤wSÿ™lHÿ•hDÿ›nJÿŒ^;ÿb>ÿ˜kGÿpLÿpLÿ’eBÿ‘hHÿÿ…ÿµ32ÿ¸87ÿ¶43ÿ´,+ÿ°"!ÿ¬ÿ©ÿ¤ÿ—ÿÿyV:ÿ‘fDÿ³Zÿ¶‚YÿªvMÿ´€WÿË—nÿ¼ˆ_ÿ¯{Rÿ´€Wÿ«wNÿ lCÿ¢nEÿ«wNÿ¬xOÿ°|Sÿ®{Sÿ|Y>ÿ8(ÿ +ÿÿGGGÿ¼¼¼ÿ···ÿ´´´ÿ¸¸¸ÿºººÿ631ÿœkEÿ¥uNÿ¥tMÿ¥tMÿ®|Uÿ²[ÿ™jFÿ—jFÿ@/"ÿÿU<(ÿpMÿŒ]9ÿ¨xRÿªxPÿ¤pHÿ°|Sÿ¯{Rÿ¬xOÿ³Vÿ¾ŠaÿªvMÿ¯{RÿÃfÿ¾Šaÿ°}UÿªyQÿ”d>ÿ­}Xÿ™kGÿŒ_<ÿ“gEÿ”hFÿ”hFÿ—jFÿ¤vRÿ™kHÿ—iFÿ¨yUÿ¤vRÿ¡tQÿ•jGÿŠ_=ÿ˜mJÿ‘d@ÿb?ÿ™lHÿpLÿžpLÿ‘c?ÿ¡tPÿ˜lJÿŽc@ÿqNÿ«~[ÿ¦xTÿŸoJÿ¡pJÿ«yRÿ›h@ÿ¤pGÿ¯{Rÿ´€WÿµXÿ¬xOÿº†]ÿµXÿ©uLÿ·ƒZÿÑtÿº†]ÿ­yPÿ°|Sÿ²~Uÿi@ÿ¢nEÿ­yPÿ®{Rÿ©xQÿœnJÿ™oMÿ__SÿÛÞ½ÿäèÅÿäèÅÿÎαÿÿÇÇÆÿÿÿªªªÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ©£ ÿ•mLÿœqPÿ¥xTÿ­|Wÿµ„^ÿ´…_ÿ«|Vÿ­~Xÿ™jEÿ­~Yÿ”d?ÿ^9ÿ•fAÿ¡rMÿ¦wRÿ¥vQÿ±ƒ_ÿ¯“{ÿ«‰lÿ°”{ÿ¸kÿ²‚]ÿ¯€[ÿœlFÿ²[ÿ™iCÿšhAÿ›jEÿ­Šlÿ´–}ÿ®…eÿºˆaÿ´‚[ÿª~[ÿµ˜~ÿ¼ž…ÿ»jÿ¯~Wÿ oHÿ·†_ÿmGÿ¬zTÿlEÿ£rKÿ¬{UÿªyRÿ²–|ÿ¢eÿ ÿ„ÿ²('ÿ³+*ÿ²'&ÿ°! ÿ­ÿªÿ¦ÿŸÿ’ÿÿ{W;ÿžsQÿºˆaÿ¶‚Yÿ¿‹bÿ̘oÿÇ“jÿ¼ˆ_ÿ±}TÿÇ“jÿÁdÿÀŒcÿ¯{Rÿ©uLÿ´€Wÿ­yPÿ¾Šbÿ¾Œdÿ²€YÿŽfGÿÿXXXÿkkkÿhhhÿfffÿhhhÿ...ÿ ÿ€X9ÿªySÿ¤sLÿºˆ`ÿº‡`ÿ²Zÿ«|Wÿ«~Zÿ‹fJÿÿ +ÿ•iFÿ¨{Wÿ›lGÿ§vOÿ¤qIÿ³Vÿ³Vÿ¿‹bÿÁdÿÀŒcÿ¼ˆ_ÿÃfÿÄgÿ¼ˆ`ÿ¹‡_ÿŸnHÿ¤wTÿH1ÿ! ÿ"ÿ$ÿ$ÿ%ÿ)ÿG3#ÿšnKÿ™pOÿU?-ÿ*ÿ'ÿ!ÿ&ÿ  ÿ! ÿ=)ÿ“gDÿœqNÿB/ÿ)ÿ'ÿ#ÿ&ÿ)ÿ)ÿO9'ÿŒa?ÿ±‚\ÿlEÿ³€Xÿ§sJÿ­yPÿ¶‚YÿµXÿÁdÿ¿‹bÿ±}Tÿ½‰`ÿΚqÿÇ“jÿº†]ÿ­yPÿÉ•lÿ¶‚Yÿ¾Šaÿ«wNÿ«wNÿ²Vÿ©wPÿ¬}Xÿ£xUÿcYHÿ¥¨ÿÊÒ«ÿÊÒ«ÿ‰vÿÿÈÇÇÿÿÿªªªÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ©¤Ÿÿ…[;ÿ~S1ÿ†X3ÿ†T-ÿ‚O'ÿ’_7ÿ«xPÿ•b9ÿ~K#ÿ„Q)ÿ\3ÿZ1ÿ˜e=ÿ™f>ÿ¡nFÿ¡nFÿ¯—‚ÿζÿØÈ»ÿÒĶÿ·ªÿ½³¦ÿ½³¦ÿ½³¦ÿ½´§ÿ½´§ÿ¾´¨ÿ¿µ¨ÿеÿÖǺÿÎÀ³ÿÀ¶©ÿ¿µ¨ÿÁ·ªÿÖɽÿÖÇ»ÿŬÿ¿µ¨ÿ¿µ¨ÿ¿µ¨ÿ¿µ¨ÿ¿µ¨ÿ¿µ¨ÿ¿µ¨ÿ¿µ¨ÿ¿µ¨ÿÒ÷ÿ«¢–ÿ ÿÿ®ÿ®ÿ®ÿ«ÿ©ÿ¦ÿ¤ÿÿlÿ ÿxT8ÿ‚V4ÿ[4ÿ–b9ÿ‚O&ÿ\3ÿ mDÿ¦rIÿ”`7ÿ„P'ÿŽZ1ÿŽZ1ÿ“_6ÿ™e<ÿ¡mDÿ±}TÿžkBÿ“`8ÿ˜f>ÿƒQ*ÿy]Gÿ‚fPÿ…jTÿx^HÿoU@ÿtZEÿÿÿ# ÿ™iBÿ§vOÿ¢oHÿ—e<ÿ–d<ÿ|K%ÿzL'ÿ„W3ÿ%ÿÿO0ÿwK'ÿ}O*ÿ†V0ÿ•b;ÿžkBÿ¬xOÿ¨tKÿ˜d;ÿ—c:ÿ[2ÿ‡S*ÿ•a8ÿ®{Rÿ“a9ÿwG!ÿcA%ÿÿrrrÿÿÿÿrrrÿHHHÿ ÿtJ)ÿ[8ÿÿrrrÿÿÿÿiiiÿqqqÿÿ€V4ÿW7ÿ*% ÿBBBÿrrrÿÿÿÿrrrÿÿc?"ÿzL'ÿ„S-ÿ‰W/ÿ\3ÿ¡mDÿ lCÿ©uLÿ™e<ÿ–b9ÿ\3ÿ„P'ÿ“_6ÿ§sJÿ§sJÿ”`7ÿ‡S*ÿŒX/ÿ‰U,ÿ’^5ÿžjAÿŸlCÿ§uNÿŽ^8ÿ€S/ÿq]BÿeiUÿŠ’sÿeiUÿeiUÿ.ÿxwwÿÿÿ///ÿÿÿÿÿÿÿÿÿàààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¨£Ÿÿ|S2ÿ„X6ÿ“e@ÿ©wOÿµXÿ½‰`ÿ¯{RÿŸkBÿªvMÿ¤pGÿ¯{Rÿ¨tKÿ¨tKÿ›g>ÿªvMÿŸkBÿ¹¥‘ÿãÑÃÿîÚÍÿîØËÿîÚÍÿïÜÐÿïÚÎÿïÚÌÿïÛÏÿïÚÍÿïÛÏÿïÛÍÿïÛÎÿðÞÒÿðÞÓÿðßÔÿðÞÓÿïÜÑÿðÞÓÿïÜÏÿïÝÑÿïÜÐÿïÝÑÿðÞÓÿïÛÏÿïÛÏÿðÞÒÿñáÖÿïÛÎÿïÛÏÿêØÌÿ­¤˜ÿÿ ÿªÿªÿ¨ÿ£ + ÿžÿœÿÿ˜ÿlÿ ÿvR5ÿ…Y6ÿ¤rJÿ§tLÿ‘eBÿªyRÿ©wPÿ¦sKÿjAÿ©uLÿ´€Wÿ›g>ÿ£oFÿ¡mDÿžjAÿ«wNÿœh?ÿ¦sKÿ¤qIÿ¦tMÿ¬zSÿ¬{Tÿ¢qJÿ`;ÿ—iDÿnIÿÿÿÿ“b<ÿŸnGÿšh@ÿœi@ÿ¢oGÿ§vPÿ¤uPÿ¢uQÿ]A+ÿÿ%ÿc@ÿb?ÿœmGÿ oHÿ–c;ÿ¨tKÿi@ÿžjAÿ¤pGÿ¯{Rÿ¶‚Yÿ½‰`ÿ­zQÿšhAÿ™jDÿŒ_<ÿ$ÿÿÿgD)ÿÿÿ ÿmJ.ÿ…]=ÿŠbCÿ$ÿÿ ÿ^@(ÿ/ ÿ ÿÿ'ÿ}T5ÿ‚Z:ÿoK/ÿ ÿÿ +ÿ_C.ÿ ÿÿ+ÿ‚X7ÿ‘eAÿ§wRÿ™g@ÿ™f=ÿ¤pGÿ§sJÿ§sJÿœh?ÿ¥qHÿ¬xOÿ°|Sÿ¶‚Yÿ«wNÿ¯{Rÿ¢nEÿ¬xOÿ¶‚Yÿ¡mDÿi@ÿ¡mDÿ¡mDÿ¦sKÿ”c=ÿ™jFÿ‘eBÿŒa@ÿ5- ÿ!ÿsP5ÿgE*ÿÈÈÇÿÿÿ¬¬¬ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ©¤ ÿ‹bAÿŠ_=ÿ”e@ÿ“`9ÿY0ÿ”`7ÿ\3ÿŠV-ÿ—c:ÿ’^5ÿŒX/ÿŸkBÿ›g>ÿžjAÿ©uLÿ«wNÿº¦’ÿâÏÂÿîÙÌÿîÙÌÿïÚÌÿðÝÐÿðÝÐÿïÚÍÿïÜÏÿïÛÏÿïÝÑÿïÛÏÿïÛÏÿïÝÑÿñÞÓÿñÞÓÿðÝÑÿñÞÓÿðÜÐÿðßÒÿñßÓÿðßÒÿðÞÑÿðÜÐÿðÜÐÿðÞÒÿñÞÓÿðÞÒÿðÜÐÿïÛÏÿëÙÎÿ«¢—ÿÿ¤ÿ¥ÿ¢ÿœÿ—ÿ”ÿ“ÿ“ÿ‘ÿzÿ ÿxS7ÿ’fDÿ‘`:ÿ™hAÿÿ;'ÿ|O+ÿ‚R,ÿ”b:ÿŽZ1ÿ“_6ÿ‹W.ÿžjAÿœh?ÿªvMÿ²~Uÿ®zQÿ›h?ÿ¦sKÿˆV.ÿ“b:ÿ‡V.ÿ‚Q*ÿ‰X2ÿ‚S.ÿ‡X3ÿÿÿÿ£rKÿ¨wPÿªxQÿ mDÿ¨uMÿ‰W0ÿ†V0ÿ}O+ÿzM*ÿ +ÿÿhD'ÿvI%ÿb=ÿ`9ÿžlDÿ«xOÿ°|Sÿ¦rIÿ£oFÿšf=ÿŽZ1ÿ”a8ÿY2ÿO)ÿƒV2ÿtJ)ÿ;$ÿ ÿÿÿÿ ÿG1ÿlG*ÿrN0ÿiD'ÿQ5ÿÿÿÿÿÿ ÿnI+ÿqL/ÿ{U8ÿwQ4ÿ +ÿÿÿÿÿÿS6ÿoH)ÿpF$ÿQ-ÿ’a;ÿ–c;ÿŸlCÿ®zQÿ§sJÿ¯{Rÿšf=ÿœh?ÿ“_6ÿœh?ÿŒX/ÿ’^5ÿ˜d;ÿŽZ1ÿ‘]4ÿ’^5ÿšf=ÿžjAÿ­yPÿ©vNÿ¥tMÿ_9ÿ’d?ÿzN*ÿV4ÿoF&ÿe?!ÿjE)ÿÉÈÇÿÿÿ­­­ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿ```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¥ œÿtK*ÿ~R0ÿ}N)ÿƒQ)ÿ†R)ÿ…Q(ÿ‚N%ÿ„P'ÿŒX/ÿ\3ÿ‘]4ÿ•a8ÿ’^5ÿ“_6ÿ‰U,ÿ’^5ÿ¶¡ÿãÒÅÿðÜÐÿðÝÐÿðÞÒÿðÝÒÿðÞÑÿïÛÏÿïÛÎÿïÝÒÿïÜÐÿñÞÓÿðÞÒÿðÝÐÿñßÓÿñßÔÿðÞÓÿñßÕÿðÝÒÿðßÔÿðÝÒÿðÞÓÿñàÖÿñàÖÿðÝÒÿðÝÒÿñàÕÿòâ×ÿñßÓÿñÞÓÿìÙÎÿ«¢–ÿÿ¤ÿ¢ÿœÿ–ÿ‘ÿŒÿ‰ÿ‰ÿ‰ÿˆÿÿb>"ÿyN,ÿˆY4ÿ\:ÿÿÿD(ÿrE"ÿƒS,ÿZ2ÿ\3ÿ“_6ÿ‘]4ÿ›g>ÿ‚N%ÿY0ÿ\3ÿ’_6ÿY1ÿ‚O'ÿ~L$ÿL$ÿM%ÿ€O(ÿ„T.ÿ‚S-ÿÿÿÿ}L&ÿ†U.ÿŠX1ÿ’_6ÿŒX/ÿ|I"ÿyI"ÿvG#ÿsF"ÿ@'ÿÿ.ÿ~R/ÿ|O+ÿ…U0ÿ…T,ÿˆU-ÿ“_6ÿ—c:ÿ‹W.ÿ‰U,ÿ…R*ÿ€N&ÿyH"ÿtF"ÿqG&ÿiC%ÿ*ÿŽŽŽÿäääÿäääÿäääÿŽŽŽÿ& ÿU6ÿX8ÿW6ÿ$ ÿŽŽŽÿäääÿäääÿäääÿäääÿÿ]ÿe=ÿe?!ÿÉÈÈÿÿÿ®®®ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿ000ÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¨£ŸÿzP0ÿƒW5ÿ–gBÿ™f>ÿ•a8ÿ©uLÿ¶‚Yÿ­yPÿ­yPÿªvMÿ²~Uÿ­yPÿ£oFÿ¡mDÿ©uLÿšf=ÿ·£ŽÿäÓÆÿïÜÏÿðÝÑÿïÛÏÿïÛÏÿïÛÎÿîÜÑÿîÜÐÿîÚÎÿìÛÎÿìÚÎÿìÚÐÿéÖÌÿéÖÌÿé×Íÿê×Íÿê×ÍÿëÙÐÿêØÎÿê×ÍÿìÛÑÿìÛÐÿíÛÐÿïÝÓÿïÝÒÿïÝÒÿðÝÓÿñßÕÿðÝÒÿëÙÌÿ«¢–ÿÿ¤ÿŸÿ™ÿ’ÿŒÿ†ÿÿÿ‚ÿ…ÿÿW;$ÿxN.ÿd@ÿ ÿÿÿ ÿ‚^Aÿ™lHÿ¨vOÿ­zRÿ´€Wÿ§sJÿ›g>ÿ¡mDÿ£oFÿ–b9ÿ§sJÿ¬xOÿi@ÿ]4ÿ¸„\ÿ²Vÿ«yQÿ©xQÿ pIÿÿÿÿ—f?ÿœkEÿ’`8ÿ¢oFÿªvMÿ—d<ÿŽ\5ÿ¥uPÿŸqMÿŽdCÿ +ÿÿ‘gFÿ–hEÿ_:ÿ—g@ÿ£pHÿ™e<ÿi@ÿ§sJÿjAÿ^6ÿžmFÿ¥uPÿ‘eBÿƒ\<ÿuQ5ÿ ÿ©©©ÿÑÑÑÿÑÑÑÿÑÑÑÿ©©©ÿ ÿ\?'ÿ^?(ÿT5ÿ +ÿ©©©ÿÑÑÑÿÑÑÑÿÑÑÑÿÑÑÑÿÿ_A)ÿdD,ÿbC*ÿ[<$ÿÿÑÑÑÿÑÑÑÿÑÑÑÿÑÑÑÿ©©©ÿ ÿkK1ÿsO3ÿ‡^?ÿ‘eAÿ˜iCÿŸnGÿkCÿžkBÿœh?ÿªvMÿ©uLÿ–b9ÿY0ÿ·ƒZÿ¸„[ÿ®zQÿ¦rIÿ²~Uÿ¯{Rÿ¦rIÿžjAÿ¢nEÿ¡mDÿ”a9ÿ¤qIÿ¤rKÿ]7ÿ…U/ÿ¢uPÿ•jIÿ‡_@ÿÊÉÉÿÿÿ¯¯¯ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ‘‘‘ÿÿÿ‰„ÿ…[;ÿT2ÿ^9ÿ¡oGÿ¡mDÿªwNÿ¯|Tÿ¸„\ÿ¨uLÿ¬yPÿ¯|Tÿ®{Rÿ¥rIÿ›g>ÿ±}Tÿ«wNÿ·£ŽÿäÒÆÿïÛÏÿïÛÎÿðÞÒÿðÞÓÿïßÔÿíÚÏÿëÚÐÿæÖÉÿäÔËÿáÑÇÿÝÍÃÿÛÊÀÿÙȾÿÙÉ¿ÿÚÌÄÿÚËÂÿÙÊÁÿÙÊÀÿÛËÁÿÞÎÄÿàÒÇÿäÔËÿçØÎÿêÚÑÿíÛÐÿñàÖÿñÞÓÿñàÕÿëØÎÿ¬¤˜ÿ ÿÿžÿ—ÿÿ‰ÿ‚ÿ|ÿuÿ|ÿ„ÿ,ÿJ4!ÿzT5ÿ3!ÿÿ ÿÿÿ ÿ†`Bÿ•gCÿ«yRÿ¯|Sÿ¸„[ÿŸkBÿ°|Sÿ­yPÿ¦rIÿ•a8ÿ«wNÿ©uLÿ´€Wÿ´€Wÿ´€Wÿ¶ƒ[ÿ¡oHÿ“hFÿÿÿÿžmFÿ¢qJÿ¡oGÿ•b9ÿ¢nEÿ¥rIÿ¥sKÿ¤sMÿžpKÿ sPÿ8'ÿÿL6$ÿ›nKÿ‘c?ÿ‘a;ÿ§uMÿ¦rJÿ™e<ÿœh?ÿ¦rJÿ›iBÿŸoIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿŽdCÿ rNÿ—gAÿªxQÿ¤qHÿ¦rIÿ–b9ÿ±}Tÿ²~Uÿ´€Wÿ±}Tÿ»‡^ÿ³Vÿ«wNÿ´€Wÿ®zQÿº†]ÿ¡mDÿ°|Sÿ©uLÿ£oFÿ“`7ÿ­zQÿªwNÿ±~Vÿ¥uOÿšnKÿ‘iHÿÊÉÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿ€€€ÿ```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿqqqÿÿÿhc_ÿŒcBÿdAÿ™kFÿªyQÿ±~Vÿ²€Yÿ­{Tÿ¥sLÿ¢qJÿ´‚\ÿ¬zSÿ©wOÿ£pHÿ©vMÿ¨tKÿ´€Wÿº£ÿçÕÉÿïÜÐÿïÛÎÿïÜÑÿðÞÒÿîÛÏÿêÙÎÿäÔËÿßÍÃÿÚÊÀÿÖƽÿÐÁ¸ÿ˽µÿǸ¯ÿǹ°ÿǺ°ÿǺ°ÿÇ»²ÿȺ±ÿʼ´ÿÏÀ·ÿÔƼÿÚËÁÿßÒÈÿä×ÎÿêÚÑÿîÞÔÿñßÔÿñßÔÿìÙÎÿ±¦›ÿÿfÿOÿKÿHÿEÿAÿ>ÿ<ÿ?ÿ3ÿÿ5$ÿI2 ÿÿÿÿ ÿÿÿ+ÿ‰_?ÿ¦wSÿ nGÿ´€Xÿ¬xOÿ¥qHÿ¢nEÿ§sJÿ­yPÿ°|SÿµXÿ±}Tÿ»‡^ÿ°|Sÿ¨uLÿ‰^:ÿÿÿÿÿ¥tMÿ›iCÿ¥sKÿ¯|Sÿ­yPÿ­yPÿ°}Uÿ±€Yÿ¢rMÿ–iEÿzS4ÿÿ ÿ˜lIÿ”gCÿ›lGÿlEÿ®{Sÿ¬xOÿ¬xOÿ±~Uÿ­|Vÿ§xSÿÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿv[ÿ›tYÿštYÿštYÿ›tYÿv[ÿv[ÿ›tYÿštYÿ™sXÿštYÿštYÿštYÿštYÿ›uZÿv[ÿv[ÿžw[ÿv[ÿv[ÿv[ÿžw[ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿÿ†]=ÿ˜lIÿnIÿlEÿ¤qIÿ§sJÿ¥qHÿ­yPÿ¹…\ÿ­yPÿ³Vÿ°|Sÿ±}Tÿ¸„[ÿ¹…\ÿ§sJÿ·ƒZÿ­yPÿ¥qHÿ£oFÿ¦rIÿ¦rIÿ°|SÿµXÿ­zQÿ¨xRÿ—jGÿ‰_>ÿÊÊÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿðððÿ ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¦¡ÿuK+ÿwK*ÿ€S/ÿQ+ÿƒS,ÿxH#ÿ{M(ÿ…W3ÿ€R-ÿ‚T0ÿ|M(ÿ~N(ÿ„S-ÿŽ\4ÿ‘^5ÿ’_6ÿ½±¢ÿíÛÏÿïÛÏÿïÛÏÿñÞÓÿòàÖÿîÜÏÿæÔÉÿßÎÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏûÿ×ȾÿÞÐÆÿåÙÏÿîÞÔÿñáÕÿòâØÿíÛÐÿº¯£ÿÿÿ-ÿ' ÿ,ÿ-ÿ,ÿ*ÿ( ÿ+ÿ7"ÿH.ÿN4ÿ +ÿ%#"ÿ$""ÿÿÿÿÿÿ$ ÿe>ÿpAÿ†T-ÿŒX0ÿ•a8ÿ˜d;ÿ–b9ÿŠV-ÿŽZ1ÿ”`7ÿŽZ1ÿˆT+ÿŠV-ÿ“`8ÿa>#ÿÿÿÿÿ‘`9ÿ‘`9ÿ‘^7ÿŠW.ÿ\3ÿY0ÿŠW.ÿ‚P(ÿQ+ÿ…W3ÿT1ÿ +ÿÿH,ÿyL)ÿ…W3ÿŒ\6ÿ]6ÿ\3ÿ”`7ÿ‰V.ÿ„T-ÿtF"ÿÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿÿa:ÿrH&ÿ}O+ÿ‡W1ÿ”a9ÿ‘]4ÿ[2ÿ\3ÿ’^5ÿ’^5ÿ†R)ÿ‘]4ÿ—c:ÿ’^5ÿ‹W.ÿ‚N%ÿY0ÿ[2ÿ”`7ÿ—c:ÿ”`7ÿY0ÿŽZ1ÿY0ÿ\4ÿ~M'ÿyL)ÿyO.ÿÊÉÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿPPPÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¨¢žÿzR3ÿxN-ÿ€T2ÿˆZ7ÿ•hDÿŠ^;ÿ€U3ÿmM4ÿH2"ÿ‰aAÿ…Y6ÿ‰\8ÿ‰Z5ÿ¨xRÿ©wOÿžkCÿ²›…ÿãÒÅÿïÝÑÿðÞÒÿðÞÒÿñßÓÿìÙÎÿãÑÈÿÛÊÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƺ³ÿÏÁ¸ÿØÊÀÿä×ÏÿíÝÓÿðàÕÿòâØÿîÞÒÿÀ´¨ÿvW=ÿtP4ÿ|U7ÿqK-ÿŠcDÿ…^?ÿZ<ÿ~W8ÿkD%ÿ~V8ÿ[=ÿcE-ÿ +ÿ--,ÿ10/ÿ+*)ÿ"! ÿÿ +ÿÿÿÿ ÿjC%ÿ”fBÿ¤sLÿ­zQÿ®zQÿ lCÿ›g>ÿ—c:ÿ®zQÿ¬xOÿ¡mDÿ®zQÿ·ƒ[ÿªxQÿÿÿÿÿ¯~Wÿ oHÿšg?ÿ˜e<ÿ˜d;ÿ©uLÿ­yPÿ mEÿ›jDÿ¦wRÿœoKÿiJ2ÿÿ#ÿ†Y6ÿ rNÿœmGÿ—f?ÿ“`8ÿ™e<ÿ–c;ÿœmGÿŒ_<ÿÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ™sYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿÿhC&ÿ„[:ÿ™mJÿškFÿ£pHÿ£oFÿ¡mDÿ\3ÿ¨tKÿ¨tKÿœh?ÿ¹…\ÿ³Vÿ­yPÿ¨tKÿ[2ÿ©uLÿ²~Uÿ«wNÿ®zQÿ¢nEÿžjAÿ‘]4ÿ©uLÿ§tKÿ”c=ÿ›nKÿ“iHÿÊÊÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿëëëÿPPPÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¦¡ÿrK-ÿyR3ÿ~T4ÿfDÿŒbAÿS:&ÿ!ÿÿÿ/ ÿ[<$ÿb?$ÿpD!ÿŽ`;ÿ”c=ÿ“a9ÿ»¯¡ÿðÞÒÿïÜÏÿñßÔÿðÞÑÿñàÖÿìÚÐÿáÐÅÿÖƾÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº¯¦ÿƺ²ÿÓǾÿàÓÉÿëÜÓÿòãÙÿòãÙÿòâØÿź­ÿ¢z\ÿ“e@ÿ”gCÿ‘dAÿšlGÿžpKÿ˜iEÿa=ÿ…W4ÿpD!ÿjG-ÿ ÿ--,ÿ:98ÿ:98ÿ210ÿ'%%ÿÿ ÿÿÿÿÿ ÿX7ÿˆ[7ÿ_9ÿ˜e=ÿ lCÿœh?ÿ¨tKÿ¤pGÿ£oFÿ§sJÿ¯{Rÿ§tKÿ§uNÿyT7ÿÿÿÿŽ]6ÿ•d=ÿ—d=ÿjAÿ lCÿ´€Wÿ«wNÿªwOÿ©wOÿœlFÿšlHÿ’eBÿ ÿÿb>"ÿ…X5ÿ_:ÿ_8ÿ›iAÿžkBÿ«xPÿnIÿŽcAÿÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿÿeB'ÿb;ÿ‡\:ÿŒ]8ÿ–c<ÿ¨tKÿ lCÿ©uLÿ¦rIÿªvMÿ§sJÿ®zQÿ²~Uÿ«wNÿ¢nEÿšf=ÿ†R)ÿ¡mDÿ›g>ÿ›g>ÿ¥qHÿžjAÿ©uLÿ¤pGÿ¡nEÿ˜gAÿ–iFÿŠ`?ÿÊÊÉÿÿÿ°°°ÿËËËÿÙÙÙÿÝÝÝÿOOOÿ°°°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¤ŸœÿrM0ÿsN0ÿX9ÿR:&ÿ ÿÿÿÿÿÿÿ ÿ}S2ÿ‚U2ÿ‹\7ÿ–e>ÿ¼²¦ÿîÜÐÿðÜÏÿðÜÐÿñàÔÿðÝÒÿëÙÎÿßÎÅÿÐÀ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±§¢ÿ¾³¬ÿͺÿÛÎÆÿéÛÐÿñá×ÿòâ×ÿñâ×ÿ¿µ¨ÿ£pHÿ¦tMÿ•c<ÿ™g?ÿjCÿ•b:ÿ]5ÿjBÿ—e>ÿJ0ÿ +ÿ$""ÿ654ÿCBBÿA@@ÿ554ÿ)('ÿÿ ÿÿÿÿÿÿÿ[<"ÿU2ÿ•e?ÿšh@ÿ­yPÿ­yPÿ¥qHÿžjAÿ”`7ÿ lCÿ›h?ÿ–d=ÿ“b;ÿÿÿÿ‹Z3ÿ“b;ÿœjBÿ¤qHÿ­yPÿ©uLÿ£oFÿ–b9ÿœjBÿ•d=ÿ^9ÿ†Y5ÿM4 ÿÿ1 ÿT1ÿ‡Y5ÿ’b=ÿ˜f?ÿ§tKÿ§uMÿ–gBÿ‚W5ÿÿ˜rXÿ›tYÿv[ÿv[ÿ›uZÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿ›tYÿv[ÿv[ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿŸx\ÿÿhF+ÿoI*ÿxM,ÿ‰Z6ÿ mFÿ¡mDÿ©uLÿ¨tKÿ¬xOÿi@ÿ lCÿ¡mDÿ™e<ÿ•a8ÿ¢nEÿ lCÿ’^5ÿ”`7ÿ˜d;ÿ¥qHÿi@ÿ­yPÿ¬xOÿ§sJÿ›h?ÿŽ^8ÿ‰\9ÿ{Q0ÿÊÉÉÿÿÿ°°°ÿËËËÿˆˆˆÿÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¤Ÿ›ÿiG,ÿ;)ÿÿÿÿÿ!!!ÿ###ÿÿÿÿÿ]?'ÿ…Z9ÿŠ]:ÿ—gAÿ¹¯£ÿíÛÐÿðÞÒÿðÞÑÿñßÕÿðßÔÿêÙÏÿÛÊÀÿʼ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦˜ÿ¶«¥ÿȼµÿ×ËÃÿçÚÐÿñãÙÿòâ×ÿòãØÿÁ·ªÿ¯{Rÿ°|Sÿ²~Uÿ°|Sÿ´€Wÿ«wNÿ lCÿ lCÿ¥sLÿ ÿÿ&%$ÿ765ÿGGFÿCBBÿ554ÿ(&%ÿÿ ÿÿÿÿÿÿÿÿ>+ÿŠ^:ÿŸnGÿ¦rJÿ°|Sÿ´€Wÿ¯{Rÿ®zQÿ¶‚Yÿ®{RÿžmEÿ–e>ÿÿÿÿ˜g@ÿšhBÿžlDÿ§tKÿ²~Uÿ¯{Rÿ«wNÿ­yPÿ²~Vÿ¨vOÿ—hBÿ‰[7ÿU4ÿ +ÿÿU4ÿŠ]:ÿ‘b=ÿ¡pJÿ­zRÿ¢pHÿ˜jEÿcAÿÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿÿrP5ÿ~W9ÿ„Z8ÿ™kFÿšhAÿ¨tKÿ­yPÿ¯{Rÿ±}Tÿ²~Uÿ°|Sÿ´€Wÿ¬xOÿ¡mDÿ¡mDÿ¬xOÿ¬xOÿ¢nEÿ¨tKÿ lCÿ¦rIÿ«wNÿ®zQÿµXÿ®{Rÿ£rLÿpMÿŒbAÿÊÉÉÿÿÿ+++ÿ ÿ___ÿÝÝÝÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¤Ÿœÿ8'ÿÿÿ ÿ"""ÿ###ÿÿ + + +ÿÿ ÿ ÿÿÿ‹cCÿ‘fDÿžpKÿµ¬ ÿëÙÏÿðÝÒÿðÞÑÿñàÖÿðÝÒÿê×ÍÿÙÊÁÿǹ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–‘ÿ²¨£ÿø±ÿÖÊÂÿçÚÐÿòäÚÿòâ×ÿóäÚÿÁ·ªÿ°|Sÿ²~Uÿ²~Uÿ¯{Rÿ³Vÿ³Vÿ·ƒZÿ¢nEÿ±Xÿ‰^<ÿ1"ÿÿ10/ÿ=<;ÿ;:9ÿ0/.ÿ$""ÿÿ + + ÿÿÿÿÿÿÿÿÿ‘gFÿšjDÿ¡nEÿ¨tKÿªvMÿµXÿ°|Sÿ¨tKÿµYÿ«yRÿ£rKÿÿÿÿ¨wPÿ¨wPÿ¢pHÿ¥rIÿ¨tKÿ¬xOÿ²~Uÿ°|Sÿ¥qHÿ°}Vÿ¨wQÿ›mIÿ›nKÿ4#ÿÿM7%ÿ˜kHÿ—iEÿ›kFÿ¢pIÿ©xQÿ qLÿdCÿÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿštYÿ›uZÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿštYÿštYÿštYÿ™sXÿštYÿštYÿ›uZÿv[ÿv[ÿŸx\ÿŸx\ÿŸx\ÿžw[ÿÿtQ6ÿzT6ÿeCÿœmIÿ²€Yÿ­yPÿ£oFÿ¯{Rÿ±}Tÿ²~Uÿ°|Sÿ²~Uÿ´€Wÿ¶‚Yÿ£oFÿº†]ÿ§sJÿ­yPÿ±}Tÿ·ƒZÿªvMÿ£oFÿªvMÿ®zQÿ±~Uÿ¤sMÿ”gDÿ”jIÿÊÊÉÿÿÿWWWÿ@@@ÿ)))ÿ“““ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ°°°ÿÿÿ¢ž›ÿ[@+ÿÿ + + +ÿÿÿÿÿÿÿ###ÿ###ÿ ÿÿ[?)ÿŠa@ÿ–jGÿ±§œÿçÖËÿîÛÏÿñßÓÿðÝÒÿðßÔÿêØÎÿÚËÂÿÈ»²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–’ÿ²¨¢ÿ÷¯ÿÕÈ¿ÿçÙÏÿñãÙÿòãÙÿòâ×ÿÁ·ªÿ¼ˆ_ÿÅ‘hÿ³VÿÂŽeÿÍ™pÿ©uLÿº†]ÿ lCÿ¢pHÿ¢rMÿeCÿ ÿÿ0/.ÿ0/.ÿ('&ÿÿÿÿÿÿÿÿÿÿÿV:$ÿŽdCÿ³„^ÿ°}Tÿ»‡^ÿÅ‘hÿº†]ÿº†]ÿË—nÿ¸„\ÿªxQÿ™gAÿÿÿÿ›iCÿ¦uNÿ³€Yÿ¶‚Zÿ»‡^ÿ½‰`ÿ»‡^ÿ¼ˆ_ÿÁdÿº†^ÿ£qJÿ—hCÿ›nJÿZ;ÿÿ ÿ•iFÿšlIÿ¯\ÿ­|Vÿ²€Zÿ©zUÿœrPÿÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿÿmK0ÿ„^?ÿcBÿ—iEÿ§uMÿÅ‘hÿ­yPÿ»‡^ÿÅ‘hÿ³VÿÃfÿÍ™pÿªvMÿ¹…\ÿ¡mDÿ¨tKÿ±}Tÿ²~Uÿ¥qHÿ¯{RÿÈ”kÿ±}Tÿ»‡^ÿÃfÿ´€Xÿ°Yÿ±„aÿfEÿÊÊÉÿÿÿ°°°ÿËËËÿÌÌÌÿvvvÿ^^^ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ°°°ÿÿÿ—”’ÿ ÿÿÿÿÿÿ ÿ###ÿ###ÿ###ÿ###ÿ###ÿÿ$ÿŒeFÿ˜mLÿ«¢—ÿâÑÆÿë×ÊÿðÝÒÿðÝÐÿñá×ÿêØÎÿÚËÂÿȺ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–‘ÿ²¨¢ÿø°ÿÕÊÂÿèÛÑÿñá×ÿòâ×ÿñáÖÿÁ·ªÿ¸„[ÿ»‡^ÿ¼ˆ_ÿ½‰`ÿ¹…\ÿ¤pGÿÁdÿªvMÿ²VÿlDÿŽ_;ÿ‹bAÿ0#ÿ ÿ$""ÿÿÿ + +ÿÿÿÿÿÿÿ ÿN5 ÿY;ÿ›oLÿ¬{Uÿº‡^ÿÁdÿ·ƒZÿ·ƒZÿÂŽeÿÃfÿªwNÿ§uNÿ®}VÿÿÿÿŸnGÿ¬{Uÿ·„]ÿ·ƒ[ÿ¼ˆ_ÿ¸„[ÿ¶‚YÿÆ’iÿÂŽeÿ°}Tÿ£pIÿ®}Wÿ‰[6ÿ–iEÿ$ÿÿcG1ÿ¤wSÿ¨zUÿ¬|Vÿ®|Wÿ qMÿ¡vUÿÿ›uZÿv[ÿštYÿštYÿ™sYÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ™sYÿv[ÿv[ÿv[ÿœuZÿštYÿštYÿ›uZÿ›tYÿ˜rXÿ™sYÿ™sXÿ˜rXÿ˜rXÿ˜rXÿ™sYÿœuZÿœuZÿštYÿštYÿštYÿštYÿštYÿ›uZÿÿuS8ÿvP2ÿ‚X7ÿoKÿ³Zÿ»‡^ÿ»‡^ÿ¸„[ÿ»‡^ÿ»‡^ÿ½‰`ÿº†]ÿ¤pGÿ¿‹bÿ«wNÿµXÿ¥qHÿŸkBÿ¯{Rÿº†]ÿ·ƒZÿ¾ŠaÿÁdÿ»‡^ÿµYÿ±€Zÿ¥xUÿ‡^=ÿÊÊÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿÌÌÌÿ@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ°°°ÿÿÿ’ÿÿ!!!ÿ###ÿÿÿÿ"""ÿ###ÿ###ÿ###ÿ###ÿ###ÿÿÿbB(ÿW6ÿ¥’ÿÜɾÿçÕÈÿîÛÏÿðÝÐÿñßÕÿêØÐÿÙÊÀÿÈ»²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ–‘ÿ±§ ÿø±ÿÕÉÀÿçØÎÿñáÖÿñâ×ÿòáÖÿÁ·ªÿ lCÿi@ÿšf=ÿ™e<ÿŽZ1ÿ“_6ÿ[2ÿ[2ÿ\3ÿ“`7ÿ™g@ÿa<ÿU4ÿ7$ÿÿÿ ÿÿÿÿÿÿÿ ÿV8 ÿpK-ÿ…Y7ÿ”d?ÿ›iAÿ“_6ÿ§sJÿ›g>ÿžjAÿŸkBÿ•a8ÿ‰V.ÿ[4ÿŠY3ÿÿÿÿ›iCÿ›jDÿ nFÿ–c:ÿ¥qHÿ–b9ÿ£oFÿžjAÿœh?ÿ‰U,ÿŠW/ÿŠY3ÿ‚S.ÿ‚T1ÿ\<$ÿÿ#ÿ‘dAÿ…W3ÿ”d>ÿ•d>ÿŒ]:ÿ~S2ÿÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿÿa>#ÿmG)ÿ‚X7ÿ‹]8ÿ”b;ÿŸkBÿšf=ÿŸkBÿœh?ÿ™e<ÿ™e<ÿŽZ1ÿ“_6ÿ\3ÿ[2ÿ\3ÿ•a8ÿŸkBÿ lCÿžjAÿi@ÿ•a8ÿ£oFÿ˜d;ÿ•b:ÿ`9ÿ{O+ÿrH'ÿÊÉÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿ°°°ÿPPPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ°°°ÿÿÿŸ›˜ÿÿÿ###ÿ ÿÿ ÿ!!!ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ ÿ,ÿ„]>ÿŸ—ŒÿÖÆ»ÿâÏÅÿìÙÍÿðÝÒÿðßÒÿéÖÌÿÚËÁÿɹ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£™‘ÿ´©¡ÿƺ²ÿÖÉÀÿèÚÐÿðàÕÿòâØÿñáÕÿÁ·ªÿ½‰`ÿ°|Sÿšf=ÿ›g>ÿ±}Tÿ¶‚YÿÀŒcÿº†]ÿ£oFÿ¡mDÿžkBÿ¡oHÿœmHÿ’hGÿP9'ÿÿÿÿÿÿÿÿ$ÿeE+ÿwQ2ÿ‚V4ÿ™iCÿ¤qIÿ°|Sÿ²~Uÿº†]ÿ´€Wÿ–b9ÿ–b9ÿ®zQÿ°}TÿªxQÿ¨wPÿÿÿÿ–e>ÿ oHÿ®|Tÿ£pGÿ·ƒZÿ¿‹bÿ˜d;ÿ\3ÿ¯{Rÿ°|Sÿ³€Wÿ©wOÿœlFÿ’c?ÿŠ]9ÿ ÿÿ~Y;ÿ‘b>ÿ¦vQÿ­}Wÿ‰[7ÿrG%ÿÿ™sXÿštYÿštYÿštYÿštYÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ™sYÿštYÿštYÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿÿhE*ÿvP1ÿ‚X7ÿ—iEÿ¨vNÿ²~Uÿ³Vÿ½‰`ÿ°|Sÿšf=ÿ›g>ÿ°|Sÿ¶‚Yÿ¾Šaÿ¹…\ÿ£oFÿ¡mDÿŸkBÿ¨tKÿ¬xOÿ´€WÿµXÿ¼ˆ_ÿ°|Sÿ”a9ÿ]7ÿ”gDÿgFÿÊÊÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿ€€€ÿpppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ°°°ÿÿÿ œ™ÿ2"ÿÿ###ÿ###ÿÿÿÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿÿÿiG-ÿ›“ˆÿÒøÿàÏÃÿêÖÊÿðÞÓÿñÞÓÿêÙÍÿÝÌÂÿο·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¡™ÿ»¯§ÿ˽´ÿÚÍÄÿèÙÏÿðáÖÿòâØÿñàÖÿÁ·ªÿ–b9ÿ\3ÿ•a8ÿŽZ1ÿ™e<ÿi@ÿŸkBÿ”`7ÿ\3ÿ—c:ÿžjAÿ¤qHÿ›h@ÿ—hBÿxM+ÿF/ÿÿÿÿÿÿ +ÿW9!ÿiB$ÿT1ÿ_8ÿ mEÿ¨tKÿ§sJÿ\3ÿŸkBÿ‡S*ÿ\3ÿŽZ1ÿ‘]4ÿ–c;ÿ’`9ÿ_8ÿÿÿÿ¡pIÿžmFÿ£qIÿ]4ÿi@ÿ‡S*ÿŠV-ÿY0ÿ•a8ÿ‘]4ÿ—c:ÿ•c;ÿ†U.ÿ‹[6ÿ‚S.ÿS9$ÿÿ9'ÿ‡X3ÿ‹[5ÿ‰Y2ÿxK&ÿwM+ÿÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿÿ`>"ÿpJ,ÿU4ÿ‘c>ÿ“b:ÿ§sJÿ—c:ÿ—c:ÿ[2ÿ•a8ÿY0ÿ˜d;ÿžjAÿŸkBÿ”`7ÿ[2ÿ—c:ÿžjAÿ¥qHÿ¢nEÿ¦rIÿ’^5ÿi@ÿŠV-ÿ]5ÿ…T.ÿ}P-ÿ€V5ÿÊÉÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿ000ÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¢šÿ]?'ÿÿÿ###ÿ ÿÿÿ!!!ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ ÿ-ÿ˜†ÿμ±ÿÝÌÁÿåÑÅÿèÖÌÿêÙÏÿåÑÆÿÜË¿ÿÑÁ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸¬¥ÿõ­ÿиÿÞÒÉÿéÙÐÿðÞÓÿñàÕÿñàÕÿÁ·ªÿšf=ÿªvMÿ«wNÿ—c:ÿ lCÿ›g>ÿ\3ÿ–b9ÿi@ÿ§sJÿ³Vÿ¨tKÿ¨tKÿ¡nGÿœlFÿ…Y7ÿK3!ÿÿÿÿÿV8!ÿnG)ÿ‚V3ÿ–f?ÿ±~UÿŸkBÿ®zQÿŸkBÿ©uLÿ¤pGÿ©uLÿ¢nEÿŸkBÿœh?ÿ]5ÿ’`9ÿ\5ÿÿÿÿ–e>ÿ¥tMÿ™f>ÿ§tKÿ¥qHÿ¤pGÿ lCÿ¢nEÿœh?ÿ’^5ÿ›g>ÿ“`8ÿ•c<ÿ\6ÿœlFÿŠ^:ÿ ÿ9&ÿ›kEÿ˜gAÿ”c>ÿ`<ÿƒX6ÿÿv[ÿštYÿštYÿ›uZÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿv[ÿ›uZÿv[ÿv[ÿv[ÿv[ÿžw\ÿŸx\ÿŸx\ÿv[ÿv[ÿv[ÿŸx\ÿŸx\ÿv[ÿv[ÿv[ÿv[ÿv[ÿŸx\ÿŸx\ÿ¢z^ÿÿhE*ÿX:ÿeCÿ˜jFÿžlEÿ©uLÿ©uLÿšf=ÿªvMÿ«wNÿ—c:ÿŸkBÿšf=ÿ‘]4ÿ–b9ÿœh?ÿ¦rIÿ³Vÿ§sJÿªvMÿ¤pGÿ©uLÿŸlCÿ¤qHÿ¢pGÿ^7ÿ„Y6ÿvM,ÿÊÉÈÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿ°°°ÿ@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¢žšÿdB)ÿ0 ÿ + + +ÿ###ÿ###ÿ ÿÿÿ###ÿ###ÿ ÿÿÿÿÿÿŽ‡}ÿÁ°¥ÿ̺°ÿÑÀ¶ÿÑÀ´ÿÒúÿÑ¿´ÿпµÿξ²ÿȺ±ÿ³ªÿ¸ª¢ÿ¯¡™ÿ¤˜ÿž“ÿž”Žÿž”Žÿž’‹ÿž“ÿž“‹ÿ¢˜ÿ¬ ™ÿ¶ª¢ÿÁ´¬ÿ˽³ÿÕƽÿáÒÊÿêØÎÿðÝÒÿñÞÓÿñàÖÿÆ»¯ÿ´ˆcÿ–b9ÿ—c:ÿ©uLÿ´€Wÿ­yPÿ¬xOÿ¬xOÿ®zQÿžjAÿœh?ÿ§sJÿ lCÿœh?ÿ¨uMÿnHÿyO-ÿ*ÿÿÿS:&ÿ{V9ÿ“hEÿ¡qKÿjBÿœh?ÿ¦rIÿi@ÿ™e<ÿ®zQÿ§sJÿŸkBÿŸkBÿŸkBÿ¶‚Yÿ§tKÿ¨vOÿ¨wPÿÿÿÿžmFÿ˜g@ÿ–c<ÿ§tKÿ¤pGÿ lCÿ›g>ÿ lCÿ»‡^ÿ®zQÿ¬xOÿ­yPÿ±Wÿ¡pIÿ•d=ÿ—f@ÿšjDÿ•d>ÿ“b<ÿ–e>ÿlFÿ…V2ÿ‚W5ÿÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿoS@ÿÿvS7ÿvO0ÿ„Y7ÿ”fAÿœjBÿ¤pGÿ«wNÿ±}Tÿ–b9ÿ™e<ÿ¨tKÿ³Vÿ¬xOÿ­yPÿ­yPÿ®zQÿžjAÿšf=ÿ§sJÿjAÿ™f>ÿ¨uMÿ¤rKÿ]6ÿ•d=ÿ`<ÿ’hEÿƒ[;ÿÊÉÉÿÿÿ°°°ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ£ž›ÿoM2ÿ[?(ÿÿÿ###ÿÿÿÿÿÿÿÿÿ ÿ ÿ@,ÿyphÿˆÿ¢–Œÿš‡ÿ + ÿÿlc^ÿŸ’Šÿ½¯¥ÿijªÿĶ¬ÿÁ²¨ÿ¼¯¦ÿ´¥ÿ°¤ÿ°¥ÿ°¢šÿ°£›ÿ°¢šÿ°¢šÿ³¥žÿº­¥ÿõ­ÿ̽µÿÓùÿÜÊÀÿå×ÏÿìÜÒÿñßÕÿðÝÒÿðÞÓÿØʽÿ´•zÿ¤pGÿ®zQÿ¹…\ÿÀŒcÿ¸„[ÿ«wNÿ°|Sÿ°|Sÿ¸„[ÿªvMÿ®zQÿ¢nEÿ­yPÿšf=ÿ mFÿ—hCÿ~V7ÿ ÿ!ÿ…`BÿdCÿŸoJÿ¬zRÿ´€Wÿ§sJÿ³VÿžjAÿ®zQÿžjAÿ™e<ÿ§sJÿ¡mDÿ³Vÿº†]ÿ¼ˆ`ÿ¬zSÿzU7ÿÿÿÿ¤sLÿ”c<ÿ§uMÿ mDÿ\3ÿ¦rIÿ¤pGÿ§sJÿ·ƒZÿÂŽeÿ»‡^ÿªvMÿ©vMÿ®|TÿlDÿŸmFÿ˜f?ÿ¢qJÿžlEÿŠY1ÿ nGÿ”f@ÿ‹^;ÿÿŸx\ÿŸx\ÿv[ÿv[ÿ›tYÿštYÿštYÿ˜rXÿ˜rXÿ™sXÿ™sXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿ˜rXÿštYÿštYÿštYÿštYÿštYÿv[ÿv[ÿv[ÿžw[ÿv[ÿv[ÿÿ}X;ÿŽfEÿc@ÿšjEÿ¢pHÿ¯{Rÿ›g>ÿ©uLÿ¥qHÿ­yPÿ¹…\ÿÀŒcÿ¸„[ÿ¬xOÿ°|Sÿ°|Sÿ¸„[ÿ©uLÿ­yPÿžkBÿ¥sLÿ’a:ÿ˜hBÿ˜iCÿ‘c>ÿœpMÿ“jJÿŠcEÿÉÉÈÿÿÿ®®®ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿPPPÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ¡¡¡ÿÿÿ•ŒÿuR5ÿiG,ÿ(ÿ ÿ"""ÿ"""ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2ÿ~@@ÿ% ÿÿPJFÿ§™‘ÿÁ²¨ÿȹ¯ÿʺ±ÿĵªÿÁ±§ÿÁ±¨ÿÁ±¨ÿÁ±¨ÿÁ³«ÿÁ²©ÿö­ÿʼ´ÿϾµÿÔÅ»ÿÛËÁÿáÐÅÿæÔÉÿíÚÏÿñßÓÿðÝÐÿðÝÑÿØɼÿ²“xÿ·ƒZÿ­yPÿ²~Uÿ´€Wÿ¨tKÿ«wNÿ¼ˆ_ÿ²~Uÿ±}Tÿ«wNÿ¤pGÿ²~Uÿ¤pGÿ—c:ÿ¤qHÿ®|Tÿ¢sNÿ•jGÿfEÿ‹`=ÿ“d?ÿ²€Yÿ³Vÿ­yPÿ®zQÿi@ÿ®zQÿ¢nEÿŸkBÿ§sJÿ³VÿµXÿ¹…\ÿ¶‚Yÿ§tKÿ›jBÿÿÿÿÿšhBÿ¡pIÿžlDÿ£pGÿ¤pGÿ­yPÿ²~Uÿº†]ÿ¼ˆ_ÿ±}Tÿ¥qHÿ´€Wÿº†^ÿªwOÿ°}Uÿ›iAÿ¨uMÿ¨uMÿšh@ÿžkDÿ¦tMÿ¢sMÿ£vRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡`Aÿ’gFÿ’eAÿmGÿ°}Uÿ§sJÿ˜d;ÿ¤pGÿ·ƒZÿ®zQÿ²~Uÿ³Vÿ§sJÿªvMÿ¼ˆ_ÿ²~Uÿ°|Sÿ«wNÿ¢nEÿ¬zRÿ›jCÿŒ\6ÿ”fAÿœoLÿ—kHÿeDÿ‚]>ÿuP3ÿÉÈÈÿÿÿ­­­ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿqqqÿÿÿa]YÿX2ÿY5ÿN.ÿÿÿ"""ÿÿÿÿÿÿÿÿÿ2/ÿÏÆxÿ±¨[ÿ”‹Bÿ—Wÿÿ±ZZÿºVVÿ”00ÿˆ77ÿ6ÿÿ±¤›ÿξµÿÕźÿÕĺÿÒÁµÿÓùÿÒøÿÓùÿÒøÿÒ¶ÿÔøÿØȼÿÛʾÿáÒÇÿãÔÉÿæÓÇÿìÙÎÿîÛÏÿðÜÐÿïÞÒÿïÛÏÿØɼÿ¡‚gÿ†R)ÿ„P'ÿ{Gÿ€L#ÿ€L#ÿ‚N%ÿvBÿxDÿK"ÿxDÿ}I ÿ‚N%ÿK"ÿ„P'ÿ€L#ÿ|Hÿ~L%ÿxH"ÿuEÿwG!ÿ‚P)ÿs@ÿuAÿ‚N%ÿxDÿyEÿM$ÿM$ÿM$ÿ€L#ÿ‚N%ÿ€L#ÿƒO&ÿ€L#ÿ}I!ÿ\:ÿÿÿÿÿ{J#ÿyH"ÿ|I!ÿ~J!ÿ‚N%ÿzFÿ~J!ÿ~J!ÿ‡S*ÿ€L#ÿ‹W.ÿxDÿs?ÿ|HÿxDÿƒP'ÿ{HÿzGÿL#ÿN%ÿs?ÿvEÿm>ÿoC ÿb9ÿX3ÿJ*ÿÿ©©©ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿÿ?%ÿ=#ÿ?%ÿÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿÿ:"ÿ>$ÿ:! ÿÿ“““ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿÿ<"ÿD(ÿQ0ÿS-ÿZ1ÿj>ÿn?ÿuDÿ}J"ÿ{Gÿ„P'ÿM$ÿ„P'ÿ„P'ÿ{Gÿ€L#ÿM$ÿ‚N%ÿuAÿxDÿ€L#ÿxDÿ{Gÿ|J"ÿvFÿvG"ÿ ÿ%)ÿ]gKÿ%)ÿ2+ÿP/ÿ­­¬ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ¡¡¡ÿÿÿ—’ŽÿyR5ÿvP3ÿwQ3ÿ,ÿ ÿÿÿÿ!!!ÿÿÿÿ\X4ÿ>;$ÿ31ÿÖÍÿ¶­aÿ‹ƒ=ÿLH%ÿ>ÿ²NNÿ¢>>ÿš66ÿ£DDÿ½ffÿÿ¡”‹ÿÔĺÿãÓÈÿäÒÇÿäÑÅÿäÑÇÿäÑÆÿäÒÇÿäÔÈÿåÒÆÿåÔÈÿç×ÌÿèÕÈÿè×ÌÿëÙÎÿíÛÐÿîÜÒÿïÜÐÿïÛÎÿïÛÎÿïÛÎÿØÉ»ÿ´”zÿ²~Uÿ¤pGÿžjAÿ±}Tÿ©uLÿ«wNÿ¢nEÿ–b9ÿ›g>ÿ¬xOÿŸkBÿ­yPÿ®zQÿ¨tKÿ¤pGÿ°|Sÿ¡nEÿ¢oFÿªwOÿ¤qHÿªwNÿ¦rIÿšf=ÿ˜d;ÿ¨tKÿ©uLÿ®zQÿ­yPÿ¤pGÿ¥qHÿ­yPÿ¤pGÿ¨tKÿ¨tKÿ¤qHÿ}X:ÿÿÿÿÿ£rKÿ¡pIÿ¤rJÿ¢oFÿ¦rIÿ©uLÿ¬xOÿ¥qHÿ«wNÿªvMÿ±}Tÿ¢nEÿ lCÿ¥qHÿi@ÿ©uLÿ¨tKÿ¨tKÿ¥qHÿ¥qHÿ¤pHÿ«yRÿ•e?ÿ—iEÿŠ`?ÿ[=ÿfD)ÿÿ¤¤¤ÿ»»»ÿ»»»ÿ»»»ÿ»»»ÿÿX<&ÿZ>(ÿ^C-ÿ ÿ˜˜˜ÿ»»»ÿ»»»ÿ»»»ÿ»»»ÿÿN4ÿU:$ÿQ6 ÿ ÿ€€€ÿ»»»ÿ»»»ÿ»»»ÿ»»»ÿÿ[?)ÿeF-ÿpL1ÿyQ2ÿ€U3ÿŒ]9ÿœmGÿ’`9ÿ¦sJÿ¯{RÿªvMÿ§sJÿ²~Uÿ¤pGÿžjAÿ±}Tÿ©uLÿ«wNÿ£oFÿ•a8ÿ›g>ÿ¬xOÿžkBÿ§uMÿŸoJÿc@ÿ8=-ÿŒšpÿ–¥xÿ–¥xÿ€‹dÿÿ]]]ÿÿÿ°°°ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¦¡ÿuN/ÿxQ3ÿvO0ÿnK1ÿÿÿÿÿ ÿÿ ÿÿÀ¸pÿkf7ÿ+)ÿ«¢TÿŸ–Jÿ‰<ÿÿ¤MMÿ®JJÿ™55ÿ‘--ÿŸ;;ÿW,,ÿ40.ÿ·¨ÿÙÆ»ÿêÕÉÿîÙÌÿïÝÐÿïÝÒÿîÚÍÿïÝÑÿîÚÎÿïÝÑÿïÝÒÿîÜÐÿïÝÑÿîÜÐÿïÜÐÿðÞÒÿïÝÑÿïÝÐÿïÚÍÿðÝÑÿïÚÍÿØÈ»ÿµ–{ÿ¨tKÿ§sJÿ¨tKÿ©uLÿ¯{Rÿ­yPÿ¦rIÿŸkBÿ‰U,ÿžjAÿŸkBÿ›g>ÿŸkBÿ¥qHÿ¨tKÿ¨tKÿ¡mDÿ¥qHÿ©uLÿ§sJÿµXÿ¨tKÿŸkBÿŠV-ÿ›g>ÿ¢nEÿ¢nEÿ lCÿ£oFÿ¨tKÿ¥qHÿ¡mDÿ§sJÿ¥qHÿ£pGÿªxQÿxS6ÿÿÿÿ›iCÿ›jDÿ™f>ÿ¡oFÿ mDÿªwNÿ¥rIÿ¨uLÿœi@ÿ©vMÿ«xOÿ¨uLÿ¢oFÿ˜e<ÿ”a8ÿ mDÿ¨tKÿi@ÿ£oFÿ lCÿ¦sJÿ¢pHÿœkEÿ‘a<ÿ’fCÿ„[<ÿtP3ÿ ÿŽŽŽÿÎÎÎÿÎÎÎÿÎÎÎÿÎÎÎÿÿZ<&ÿaC+ÿ_B*ÿ:(ÿ222ÿÎÎÎÿÎÎÎÿÎÎÎÿ¾¾¾ÿ ÿO2ÿX;%ÿZ=&ÿF.ÿ&&&ÿ´´´ÿÎÎÎÿÎÎÎÿ222ÿ ÿaB*ÿrQ6ÿ|V8ÿ†\;ÿŒ^;ÿ€P+ÿ•d>ÿ˜f>ÿ–c:ÿŸkBÿ¦rIÿ©uLÿ¨tKÿ¦rIÿ©uLÿ©uLÿ®zQÿ®zQÿ§sJÿžjAÿ‰U,ÿžjAÿjAÿ”c<ÿŽ`;ÿ‰^;ÿG@-ÿy†aÿ–¥xÿ–¥xÿ[aFÿÿÈÇÇÿÿÿ«««ÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¥ œÿvO0ÿ{S5ÿƒZ;ÿˆ`@ÿ[<ÿjF*ÿ  ÿÿ ÿ@*ÿP6!ÿÿ±©aÿlf8ÿ64 ÿÐÇyÿ£›Oÿ{t8ÿÿ^,,ÿ­IIÿ–22ÿ§CCÿš<<ÿ!ÿQKFÿ­¡–ÿÊ»¯ÿÖÈ»ÿØÈ»ÿØʽÿØʽÿØÈ»ÿØɼÿÚʽÿØÈ»ÿØʽÿØÈ»ÿÙË¿ÿÕƹÿØÈ»ÿØʽÿê×ËÿðÝÐÿïÚÌÿïÚÌÿïÙÌÿÑöÿ·˜}ÿ±}TÿŸkBÿ lCÿ¡mDÿ˜d;ÿ™e<ÿ¦rIÿ˜d;ÿ›g>ÿŽZ1ÿ—c:ÿ¢nEÿi@ÿ®zQÿ°|Sÿ«wNÿ¡mDÿ™e<ÿŸkBÿ™e<ÿ¢nEÿ¤pGÿŸkBÿ•a8ÿ‹W.ÿ™e<ÿ£oFÿi@ÿ®zQÿ±}TÿªvMÿ£oFÿ’^5ÿŸkBÿžkBÿ˜f?ÿ—f?ÿÿÿÿŒ[4ÿ™hBÿ˜e>ÿ¢pGÿ¬yPÿ©vMÿ¨uLÿ‘^6ÿŸlCÿŸlCÿ›h?ÿ›h?ÿ£pGÿŒY1ÿ\4ÿ”a9ÿ¢oFÿœi@ÿ£oFÿªvMÿ²~Uÿ®{Rÿ˜e>ÿ•d=ÿˆZ5ÿ€V3ÿpJ+ÿC-ÿÿÿÿÿÿÿhH.ÿoN5ÿnN4ÿ_@'ÿÿÿÿÿÿ5!ÿ_>%ÿa?%ÿeC(ÿ_@'ÿG/ÿÿÿÿ ÿF/ÿN5 ÿnI+ÿwN.ÿ_<ÿ‡X1ÿ’`9ÿ[4ÿ•b9ÿ lCÿŸkBÿ¬xOÿ®zQÿ°|Sÿ lCÿ lCÿ lCÿ˜d;ÿšf=ÿ¦rIÿ™e<ÿšf=ÿY0ÿ•a9ÿ™gAÿ‰\8ÿŽdBÿYT=ÿƒiÿ–¥xÿ–¥xÿ{‚^ÿ ÿÇÇÆÿÿÿªªªÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¦¡ÿ…]>ÿ‹dDÿ“iJÿŽeEÿ‰aBÿ‚\?ÿ5%ÿ +ÿÿ6$ÿU:%ÿÿ·®fÿlg7ÿ75!ÿ¿¶hÿ¯¦Zÿ„=ÿic0ÿ ÿÿq22ÿ¢DDÿ8ÿÿs_Mÿš}gÿ±’yÿ»œÿ½žƒÿ¹šÿ¼‚ÿÀ¡†ÿ¾ÿ½žƒÿºš€ÿº›€ÿ»œÿ¸˜~ÿ³“yÿ´”zÿ¹šÿ¾¯žÿÁ·ªÿÁ·ªÿÁ·ªÿÁ·ªÿÀ§ÿºiÿ½‰`ÿµXÿ±}Tÿ·ƒZÿ±}Tÿ¤pGÿ¦rIÿ²~Uÿ¤pGÿ³Vÿ³Vÿ¯{Rÿ´€Wÿ½‰`ÿ¶‚Yÿ¼ˆ_ÿ·ƒZÿ²~Uÿº†]ÿ´€Wÿ¥qHÿ¥qHÿ«wNÿ›g>ÿµXÿ®zQÿµXÿº†]ÿ¸„[ÿ¸„[ÿ¹…\ÿ¶‚YÿµYÿ»‡_ÿ²€XÿžmFÿ—g@ÿÿÿÿ¤tMÿ©ySÿªySÿ¯|Uÿ·…]ÿ®|Tÿ°}Vÿ²€Xÿ³Zÿ±Xÿ¤rJÿ—e>ÿ nGÿ–d<ÿ¨vNÿªxPÿ®{Sÿ­zRÿµ‚Yÿ»‡_ÿ´€Xÿ´€Wÿ´€Xÿ«yPÿ«zTÿ—jFÿ€V5ÿ]@(ÿnI-ÿ1!ÿlL4ÿB/ÿbF/ÿ]B-ÿdI2ÿ…`Cÿ„_@ÿ ÿÿÿÿÿÿÿÿ‡aCÿˆbCÿÿÿÿÿÿÿÿÿ‹bAÿ`>ÿ—hBÿ«yRÿ¨uLÿ±~Uÿ¸„[ÿ®zQÿ²~UÿÀŒcÿ·ƒZÿ½‰`ÿµXÿ±}Tÿ¸„[ÿ²~Uÿ¤pGÿ¦rIÿ±}Tÿ¢nEÿ³Vÿ¯|Sÿ¥tMÿœoLÿ•lKÿFA.ÿƒiÿ–¥xÿ–¥xÿckNÿÿÇÆÆÿÿÿ©©©ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ±±±ÿÿÿ¤Ÿšÿ~W8ÿ}V7ÿX8ÿV5ÿ}U5ÿpO5ÿ ÿ1 ÿKZ#ÿ + ÿ ÿÿ¼³iÿys>ÿÿÿÿÿÿÿÿ ÿÿÿ?+ÿtQ2ÿ–hAÿ¤rIÿ³Wÿ©vMÿ®{Rÿ¥rIÿ™f=ÿ©uLÿ«wNÿ±}Tÿ°|Sÿ­yPÿ¯{Rÿ¬xOÿ­yPÿ£oFÿªvMÿµXÿ¬xOÿ°|Sÿ±}Tÿœh?ÿªvMÿ«wNÿ³Vÿ³Vÿ¬xOÿ°|Sÿ°|Sÿ¯{Rÿ§sJÿ­yPÿ´€Wÿ¯{Rÿ¯{Rÿ±}TÿŸkBÿ¨tKÿ§sJÿ¯{Rÿ±}Tÿ©uLÿ±}Tÿ©uLÿ©uLÿ¢nEÿ«wNÿ³Vÿ±}Tÿ¯{Rÿ­yPÿ¡mDÿ¥rIÿ›h?ÿ¨uMÿ¬zRÿ£pHÿ«zSÿ¡pJÿ—gAÿÿÿÿmHÿŸpJÿœkFÿ›kCÿlEÿ–e>ÿœkEÿ¦vOÿžmGÿ¨wQÿ¦uOÿ—f@ÿœkEÿlFÿ§vOÿ¦tMÿ¥sLÿ¤qJÿ¡nGÿ¢oGÿžkBÿ£pGÿ®zQÿ§tKÿ©wPÿ¤tNÿ”jHÿÿÿÿÿÿ ÿ$ ÿÿƒZ9ÿ†]=ÿF1 ÿÿÿÿÿÿÿ;)ÿ’hFÿŠ`>ÿG2!ÿÿÿÿÿÿ ÿ>+ÿ—jFÿnHÿ¥sLÿŸlCÿ©uLÿµXÿ¬xOÿ¯{Rÿ³Vÿi@ÿªvMÿ«wNÿ²~Uÿ³Vÿ«wNÿ°|Sÿ¯{Rÿ®zQÿ§sJÿ­yPÿ´€Wÿ¬yPÿ¤sLÿ˜kGÿ~T4ÿLH2ÿŒšpÿ–¥xÿ–¥xÿv\ÿ ÿÇÆÆÿÿÿ©©©ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ°°°ÿÿÿ¡œ™ÿ‡_AÿfGÿ“jJÿ ÿÿÿ8 ÿ Eÿ Dÿ0 ÿ +ÿÿfb=ÿOJ(ÿ><ÿ"! ÿÿ +ÿFB(ÿ<:ÿ85ÿ2/ÿ+(ÿÿE0ÿzU7ÿ rLÿ­{Tÿ©xQÿ¶„]ÿ¬zSÿ½‹dÿ²Yÿ³Zÿ±Wÿ¹†^ÿ±~Vÿ·„\ÿ´Yÿ¦sKÿ£pHÿ¬yQÿ²Wÿ«xPÿ¾‹cÿ­zRÿ¾‹cÿ²Wÿ·„\ÿµ‚Zÿ¹†^ÿ´Yÿ·„\ÿ³€Xÿ¨uMÿ¢oFÿ¬yPÿ¯|Tÿ­zQÿ¿‹cÿ¬xOÿÅ‘hÿ°|Sÿ¼ˆ_ÿ·ƒZÿÁdÿº†]ÿ¼ˆ_ÿ½‰`ÿ°|Sÿ¨tKÿ¦rIÿ®zQÿ²~Uÿ¿‹bÿ¬xOÿÅ‘hÿ©vMÿ¹†^ÿ¹†^ÿ»‰aÿ±Xÿ³‚Zÿ´ƒ]ÿ›lFÿŸoJÿÿÿÿ¨yTÿoIÿ¬|Vÿ¡qKÿ¯Yÿ¬|Vÿ®Yÿ«{Vÿ¤tOÿ«|Wÿ–gBÿ¥vQÿ^9ÿŸpJÿªzTÿ«{Uÿ¨xQÿ¬{Tÿµ„\ÿ·„]ÿ¸†^ÿ¹†^ÿÄ‘hÿªwNÿ´‚Zÿ¤sLÿ¡sNÿH2 ÿÿÿÿÿÿ ÿD1"ÿ›pNÿ›pMÿ£xVÿ“hFÿ–lKÿgGÿ…]=ÿ…\<ÿ’hFÿ—lIÿ–jGÿ¡uRÿ˜lIÿ£xVÿ—lKÿ’iIÿfFÿ•lLÿ”jHÿ sPÿ¢tPÿmGÿžmEÿ¬yPÿ´€Wÿ¯{RÿÁdÿ±}TÿÁdÿµXÿ»‡^ÿ¹…\ÿ½‰`ÿ¸„[ÿ»‡^ÿ·ƒZÿ¬xOÿ¥qHÿ¯{Rÿ±}Tÿ¯{Rÿ¾‹bÿ¢qKÿ¬[ÿŠaAÿ8=-ÿŒšpÿ–¥xÿ–¥xÿ‹dÿÿÇÆÆÿÿÿ¨¨¨ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÐÐÐÿ¯¯¯ÿÿÿ ›—ÿˆbEÿ‹eFÿmO7ÿÿ=Pÿ ÿB`6ÿª€ÿŲ¡ÿ¤°ÿ%Hÿ%ÿ& ÿ!&ÿÿÿÿ + +ÿ ÿÿÿÿ#ÿÿ_C+ÿ}W8ÿb=ÿa=ÿ_;ÿ¥wSÿ¤uQÿ£uQÿ rMÿškFÿª{Vÿ­}Xÿ­~Yÿ£tNÿ™iCÿžnHÿ¢rLÿ¦vPÿ™jDÿ]7ÿ¦vQÿ«{Uÿ­}Wÿ¦vQÿ¡qKÿ«{Uÿ¦vQÿ¸ˆbÿ§wQÿ™iCÿ›kEÿ¦uOÿ¬{Tÿ¢pJÿ]5ÿªxPÿµ‚Zÿ»ˆ_ÿ´€Wÿ¶‚Yÿ°|Sÿ±}TÿÇ“jÿ¼ˆ_ÿ§sJÿ¥qHÿ´€Wÿ©uLÿ²~Uÿ•a8ÿ®zQÿ¸„[ÿ¾Šaÿ°}Tÿ¶„\ÿ°}Vÿ®|Uÿ¿Žfÿ¶…^ÿ£sMÿ“e@ÿ¤uPÿÿÿ" ÿ™jEÿ§yTÿª{Vÿ£tNÿ¬}Xÿ§xSÿ¢sOÿ³…aÿ•mOÿpLÿˆ[7ÿŸqMÿ†X4ÿšlHÿ‰Z5ÿ™jDÿ¯Yÿ¯~Xÿ²Zÿ´ƒ[ÿ®|TÿªxPÿÅ’jÿ¾Šbÿ¬yQÿ“b;ÿ¥vPÿ‘b>ÿ„W3ÿƒX6ÿ…[:ÿ˜oNÿ—mKÿ tRÿpMÿ–iFÿšmIÿ¬~Zÿ sOÿ—jGÿ‡\:ÿ‘fDÿeBÿc@ÿ`=ÿ‹]9ÿ¤vQÿ¢tQÿžqMÿšnJÿdBÿœqOÿžsPÿ¤wTÿžpLÿ˜iCÿ pIÿ©wPÿ³Wÿ§sJÿ˜d;ÿ´€Wÿ»‡^ÿ½‰`ÿµXÿ°|Sÿ¸„[ÿ³VÿÈ”kÿ¶‚Yÿ¦rIÿ¨tKÿ²~Uÿ·ƒZÿ¬xOÿ•a8ÿ­zRÿ¬{Uÿ¤wTÿfEÿFA.ÿy†aÿ–¥xÿ–¥xÿ`eIÿÿÇÆÆÿÿÿ¨¨¨ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿ¯¯¯ÿÿÿ›–“ÿyT7ÿsN0ÿ@,ÿÿ0 ÿ%<ÿ|nÿiAÿU- ÿWz:ÿOp"ÿ3Xÿ?\(ÿK_=ÿP`+ÿ/ÿÿ~77ÿs11ÿWÿIÿd!!ÿ&ÿ" ÿ\>$ÿkE&ÿvM+ÿ}S1ÿ‰_=ÿ†[:ÿ†\;ÿ‡];ÿbAÿcAÿŠ_=ÿT1ÿ|Q.ÿyN+ÿˆ\:ÿ„X5ÿ|P-ÿ€T1ÿƒW4ÿŒ`=ÿa>ÿ‰]:ÿdBÿc@ÿ‘eBÿŠ^;ÿS0ÿ|P-ÿ{O,ÿ‰\9ÿ|P-ÿ{N+ÿƒV2ÿ‰[6ÿ”d?ÿ›kEÿ—e>ÿ¤qIÿŸkCÿ¬xOÿŸkBÿ’^5ÿ’^5ÿ’^5ÿ›g>ÿ¤pGÿ‹W.ÿ–b9ÿ˜d;ÿ lCÿ¥qHÿžjAÿ¥rIÿ™f>ÿ¨vNÿkDÿngbÿlfaÿlf`ÿjd_ÿga]ÿf`[ÿ20.ÿ ÿ{S3ÿ”fBÿ`=ÿ•gCÿ`;ÿšlGÿ‘c?ÿŠ^:ÿT1ÿ ÿ@*ÿƒW5ÿ{O,ÿvJ'ÿƒV3ÿˆ[7ÿ—iDÿ”e@ÿnHÿ–e?ÿ¡pIÿ¤rJÿ›iAÿ’_7ÿ–c:ÿ]5ÿ”b;ÿŽ]6ÿ†V0ÿ‡X4ÿ…X4ÿ’eBÿ‹_=ÿ‘dAÿŽ`<ÿ˜jEÿškGÿ‘b=ÿˆY4ÿ‰Z6ÿ‚S.ÿŒ^:ÿ‰\8ÿƒU0ÿ†W2ÿ‹]7ÿ™jEÿ–gAÿ—hBÿ—hBÿœmHÿ™kFÿ’eAÿ‡Y5ÿ†W2ÿ…U/ÿ˜hAÿ“a:ÿŽ[3ÿ–c:ÿ›g>ÿ¥qHÿ§sJÿ¢nEÿ¬xOÿ¨tKÿ¬xOÿ¢nEÿ”`7ÿ‘]4ÿ‘]4ÿ¡mDÿ•a8ÿŽZ1ÿ•a8ÿšf=ÿ¢nEÿ¤qHÿ”c<ÿ‘dAÿ~U5ÿD?,ÿƒiÿ–¥xÿ–¥xÿbjLÿ +ÿÇÆÆÿÿÿ©©©ÿÈÈÈÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿ®®®ÿÿÿš•‘ÿzV9ÿY;#ÿ +ÿ) ÿ*MÿØÞÀÿ¥tÿNr"ÿ=kÿv˜Dÿb~<ÿ~—YÿVy8ÿUt'ÿ_Oÿf@ÿ ÿ ÿX""ÿ‰55ÿ‹77ÿb''ÿ ÿ4%ÿ3"ÿ5#ÿ6"ÿ9&ÿ<(ÿE1"ÿC0 ÿ=*ÿB.ÿ:'ÿL1ÿ_?%ÿ„\=ÿhIÿhIÿˆ_@ÿ{S3ÿpH(ÿyQ1ÿ{S3ÿeEÿyV:ÿhG-ÿ„\<ÿxP0ÿqI)ÿuM-ÿ‡_?ÿeEÿ•mMÿŽfFÿX8ÿ{Q0ÿzQ1ÿ„X4ÿ£uQÿ¥uOÿŸnGÿ¥rJÿšg>ÿ\3ÿ“_6ÿ°|Sÿ²~UÿÅ‘hÿº†]ÿžjAÿi@ÿ™e<ÿ’^5ÿº†]ÿ·ƒZÿ¨uLÿ¡nGÿ•c<ÿ…W2ÿÿ‡‡‡ÿÿŒŒŒÿˆˆˆÿˆˆˆÿ‰‰‰ÿ20.ÿ|N*ÿœpKÿŸrNÿ—jGÿˆ[7ÿˆ[8ÿ‰\9ÿwL)ÿpM1ÿÿ)ÿ˜mLÿ}R0ÿƒX6ÿ‚V4ÿ}Q.ÿ“eAÿ¤uQÿŸpKÿ‘a;ÿ˜g@ÿ‘_8ÿ[3ÿ›h@ÿ¬yPÿ»ˆ_ÿ¶„\ÿ–d=ÿ•d>ÿŽ^9ÿ‹\7ÿŽ`;ÿ£uPÿ rMÿ•e@ÿmGÿŽ]7ÿ‹Z2ÿ“a;ÿ¦uMÿµƒ\ÿ°XÿlEÿ“b;ÿŒZ3ÿ”b;ÿ™g@ÿ°~WÿªyQÿžlEÿ§vOÿ’a:ÿ‹Z3ÿ‘`9ÿ¥tMÿ´‚[ÿ·…]ÿ­zRÿŸkCÿ‘]4ÿi@ÿŸkBÿ·ƒZÿ²~Uÿ¥qHÿ«wNÿœh?ÿ’^5ÿ—c:ÿ°|Sÿ·ƒZÿÁdÿ·ƒZÿ£oFÿšf=ÿ›g>ÿ˜d;ÿ¶‚Zÿ©xRÿ’eAÿ†\<ÿ80!ÿƒiÿ–¥xÿ–¥xÿZ`FÿÿÇÇÆÿÿÿ©©©ÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿ­­­ÿÿÿ”Œÿÿ35ÿ!.ÿ+Lÿ’wÿ¢‡ÿ'Tÿg€Tÿ›iÿ•Y"ÿWYÿÿ–b9ÿ•a8ÿ•a8ÿŸkBÿi@ÿ™e=ÿxL)ÿR6 ÿ  +ÿÿGGGÿ¼¼¼ÿ¸¸¸ÿ²²²ÿµµµÿ´´´ÿ2/,ÿzL)ÿƒV3ÿ„X5ÿ…Y6ÿzO+ÿhD(ÿ2ÿ\:ÿ4"ÿ!0ÿ +ÿuN1ÿgE*ÿ ÿI4ÿxL)ÿ‚V3ÿ†Y5ÿŽ_;ÿ‡W2ÿŒ\6ÿŒ[4ÿ†T,ÿ“`7ÿjAÿ™e<ÿ›g?ÿ˜e=ÿ“`9ÿ‡U.ÿ‘`9ÿ\5ÿŽ]6ÿ‘`9ÿŒZ3ÿ–d=ÿ—e=ÿŠW/ÿ‘]5ÿjAÿžkBÿ—c;ÿšf>ÿ–b:ÿˆU,ÿŸlCÿ’^5ÿ•a8ÿ“_6ÿ]4ÿŸlCÿ•a9ÿ’^6ÿ\4ÿšg>ÿ¡nEÿšf=ÿ lCÿ˜d;ÿY0ÿ¤pGÿ•a8ÿšf=ÿ’^5ÿšf=ÿ—c:ÿ™e<ÿ’^5ÿ‘]4ÿ™e<ÿ lCÿŸkBÿ§sJÿšf=ÿ’^5ÿi@ÿ˜d;ÿœh@ÿ^7ÿ†X4ÿsI(ÿVQ9ÿƒiÿ–¥xÿ–¥xÿ{‚^ÿ ÿÇÇÆÿÿÿªªªÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÎÎÎÿ¬¬¬ÿÿÿ“Œÿ ÿ.ÿÿžjAÿ£oFÿ¤pGÿ«wNÿ¦rIÿfDÿ+ÿ ÿI4"ÿZ>)ÿÿÿ»»»ÿ···ÿ²²²ÿ´´´ÿ´´´ÿ30-ÿ`=ÿŽb?ÿ”iFÿa?ÿ—lJÿxU:ÿ ÿÿÿHk?ÿ ÿÿ ÿÿÿÿÿV=)ÿ™kGÿ¢sMÿ§wQÿ oHÿ¡nGÿjBÿjAÿ—c:ÿ¢nEÿi@ÿ¢nEÿ¢oFÿ£pGÿ¨uMÿ¬yQÿ®{Sÿ¯|Sÿ°}Tÿ±}TÿªvMÿŸkBÿžjAÿœh?ÿ lCÿ›g>ÿ¤pGÿ¢nEÿ¥qHÿ­yPÿ¯{Rÿ¯{Rÿ°|Sÿ°|Sÿ¬xOÿ¬xOÿ¢nEÿšf=ÿŸkBÿœh?ÿ–b9ÿ¡mDÿªvMÿ¥qHÿ«wNÿ®zQÿ®zQÿµXÿ±}TÿªvMÿªvMÿ¤pGÿ—c:ÿžjAÿ +ÿÿÿ*ÿS8$ÿ—iEÿ©vMÿ§vOÿ¢sOÿ–kHÿ8=-ÿƒiÿ–¥xÿ–¥xÿ|ƒ^ÿ +ÿ···ÿÿÿ«««ÿÉÉÉÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÎÎÎÿ¬¬¬ÿÿÿŒ‰ÿ2!ÿÿ +ÿ4D +ÿfzUÿ'Tÿy“mÿBwÿd”-ÿE{ÿn’RÿN0ÿN…ÿJpÿRR%ÿBkÿk†Jÿcx=ÿ; ÿ ÿM3ÿÿ°°°ÿÎÎÎÿÿðððÿùùùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÿ???ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvO/ÿ~R.ÿŠ^:ÿqN3ÿ1!ÿ(ÿgF,ÿ·ƒZÿªvMÿ©uLÿ¬xOÿ«wNÿ¯{Rÿ—c:ÿgF,ÿ ÿY9 ÿ›jBÿŸnGÿšiCÿÿÿ¼¼¼ÿ···ÿ³³³ÿµµµÿµµµÿ31/ÿ‚V3ÿ‰^;ÿƒX6ÿ/ÿ"ÿ#ÿ ÿ4M(ÿBc5ÿ ÿÿ  +ÿ1J&ÿÿ ÿÿÿ ÿ‡Z6ÿˆZ5ÿoIÿ™iCÿ_8ÿ^5ÿªxPÿ­{Sÿ mFÿ nGÿ¨vOÿ mFÿ˜f>ÿ™g?ÿšh@ÿ—e=ÿŠX1ÿ¥sLÿ mFÿ™g?ÿ•c;ÿœjBÿ®|Tÿ¥sLÿ¢oHÿ¡nGÿ¥sLÿœjBÿ¡nGÿ›iAÿ•c;ÿ‹Y2ÿ£pIÿ¦tMÿ¤qJÿ“a9ÿ“a9ÿ³Yÿ§uNÿ£pIÿœjBÿ§uNÿ¡oHÿžlEÿœjBÿ–c<ÿ’`8ÿ¡nFÿ¬yPÿŸkCÿ™f=ÿŸkBÿ¼ˆ_ÿÿ©uLÿ¦rIÿ—iEÿlL2ÿ&ÿ2"ÿqK-ÿ†V1ÿ‹^;ÿ ÿÿšž}ÿCI5ÿ +ÿ]@)ÿ653ÿÿÿžžžÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÎÎÎÿ¬¬¬ÿÿÿ~zwÿ ÿ"ÿ@ÿ­–ÿ¦´ŸÿEn3ÿ‰£}ÿ2iÿFÿSyAÿˆšÿŠ£ÿA|ÿf–.ÿ˜®tÿLs)ÿwˆYÿNk'ÿ)ÿ ÿ]A*ÿÿ»»»ÿÓÓÓÿÿïïïÿøøøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÿ???ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿÿÿÿÿ~V6ÿ™nLÿ—iDÿ“b;ÿœi@ÿ„W2ÿ\B-ÿ0#ÿ¨wPÿ±}Tÿ¯{Rÿ­yPÿ­yPÿŽdBÿ(ÿ–e?ÿµYÿŸnFÿ_8ÿ’a:ÿÿÿ¿¿¿ÿºººÿ¶¶¶ÿ¸¸¸ÿ···ÿ30.ÿ’fBÿ‹`=ÿV4ÿ.!ÿÿ;W3ÿHk@ÿ ÿ*ÿ-ÿ ÿ2K+ÿ%ÿ'?'ÿj—dÿDg=ÿÿS8#ÿ–iFÿ—iEÿ^:ÿ™iEÿ‘b=ÿšjEÿ¤uPÿ®Zÿ¢tOÿœnJÿ’d@ÿ˜iEÿ“eAÿ•gBÿa<ÿšlHÿžpKÿ’c?ÿ‘b>ÿ‰Z6ÿ›mIÿ¢tPÿª{WÿoJÿžpKÿ—iDÿ•gBÿ—iDÿ˜iEÿ_:ÿšlHÿŸqLÿ’d@ÿ‹]9ÿ‡Y4ÿšlHÿ¢sOÿ©zVÿ¡rNÿŸqLÿšlHÿ–hCÿœmIÿ›mHÿŠ\7ÿ™jEÿªzTÿœkEÿ•c<ÿ™g?ÿjBÿ·ƒZÿ¿‹bÿÿ³Vÿ¯{Rÿ¬xOÿ°|Sÿ±}Tÿ~T3ÿ1!ÿK5%ÿ”fBÿƒW4ÿ€V5ÿxXÿ.$ÿ‚^BÿvT8ÿ'%$ÿÿÿ“““ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÎÎÎÿ¬¬¬ÿÿÿRPNÿÿAVÿCÿOkCÿr‹TÿLq$ÿŽ§ƒÿ3kÿIÿ[‹5ÿ_€PÿCu-ÿFÿ=tÿƒ¡_ÿZ:ÿºÄ“ÿ‰‚Fÿ!7 +ÿ ÿI3#ÿÿ¿¿¿ÿÔÔÔÿÿîîîÿøøøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯ÿOOOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿÿÿÿÿ„]?ÿ‚X7ÿb>ÿlEÿ°}TÿµXÿ²~UÿšlHÿ6%ÿbAÿ·ƒZÿ°|Sÿ˜kGÿ,ÿšiBÿ³VÿjAÿŸnFÿ¡pIÿ¦uNÿÿÿÀÀÀÿ¼¼¼ÿ¹¹¹ÿ»»»ÿ¸¸¸ÿ41/ÿšmJÿ‘eBÿŽdBÿ~T3ÿ]A+ÿÿÿÿÿFk9ÿ;X2ÿ +ÿÿc’WÿOuFÿ  ÿÿ‘fDÿ‡[8ÿb>ÿ“fBÿ”gBÿƒ[<ÿ•jIÿ˜kHÿ–jGÿ‡\:ÿ‰^=ÿ˜nLÿ’gFÿ”jHÿ…[9ÿ”jHÿˆ]<ÿƒX7ÿŠ`>ÿŠ`>ÿŽdBÿ“iGÿeCÿ”jHÿbAÿˆ]<ÿ—mKÿˆ]<ÿ’gFÿ†\:ÿ–kJÿŽcBÿ†\:ÿŠ`>ÿ…[9ÿ‘fEÿfDÿfDÿ“iGÿfDÿ‰^=ÿ–kJÿˆ]<ÿ‘fEÿˆ^<ÿ’gFÿ{V:ÿ…[9ÿ•fBÿ•e@ÿªyRÿ¬zRÿ°}Tÿ²~UÿÿªvMÿ·ƒZÿ«wNÿ°|Sÿ«wNÿ¨tKÿ®|SÿsN1ÿ/ ÿ‹`>ÿ™lIÿ–jHÿ‹bBÿ€Z=ÿuQ4ÿ)'$ÿÿÿ“““ÿÊÊÊÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÎÎÎÿ¬¬¬ÿÿÿ…~ÿ*ÿÿ ÿ9V-ÿCi ÿ2\ÿ†¢vÿ3gÿW‹(ÿJ‚ÿB}ÿlš:ÿb‘-ÿBxÿŸ´tÿQv1ÿ]~/ÿu{XÿDKÿ ÿ2!ÿÿÁÁÁÿÔÔÔÿÿíííÿøøøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???ÿ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿÿÿÿÿÿoJ,ÿzP0ÿc@ÿ–e>ÿ—c;ÿ—c:ÿ—c:ÿžjAÿ“b<ÿ)ÿ‘`:ÿ\3ÿ:&ÿsH'ÿ\3ÿi@ÿ™f>ÿlDÿ˜g@ÿ˜g@ÿÿÿÀÀÀÿ¼¼¼ÿ¹¹¹ÿ»»»ÿ¸¸¸ÿ30-ÿ~P-ÿzN,ÿuM-ÿ?)ÿÿ4M'ÿ&9ÿPw=ÿ ÿ +ÿ%7#ÿÿMrDÿ ÿÿ*ÿÿwM+ÿ~R/ÿ‡Z7ÿ‹^:ÿ|O,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒ`=ÿŒ^:ÿ”d>ÿ^7ÿ[3ÿžjAÿÿ˜d;ÿ•a8ÿ’^5ÿ˜d;ÿŒX/ÿ‘]4ÿ™f>ÿ•c;ÿvQ4ÿ7%ÿŠ\7ÿ…W3ÿ}R0ÿxP1ÿrL.ÿ*'&ÿÿÿ”””ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÎÎÎÿnnnÿÿ ÿYURÿkJ0ÿ`C,ÿ ÿ"Dÿ¶ž—ÿ}ÿyšRÿµÅÿ¢—ÿdƒ4ÿ:tÿLÿ€¡aÿÂÑšÿ ´‚ÿ“šxÿŒ˜jÿ.N ÿ.'!ÿZA.ÿR6 ÿÿÇÇÇÿ×××ÿÿïïïÿøøøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???ÿ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÿÿÿÿÿzU8ÿ‡^>ÿ—jGÿšjDÿ®{Rÿ”`7ÿi@ÿ™e<ÿŸkBÿbAÿ)ÿuK)ÿ8$ÿ—c:ÿ³Vÿ¯{Rÿ©vMÿ¤rKÿ›iCÿ oHÿÿÿÀÀÀÿ¼¼¼ÿ¹¹¹ÿ»»»ÿ¸¸¸ÿ30-ÿS/ÿŠ];ÿ ÿÿ ÿ  ÿ'ÿ +$ÿ +ÿ +ÿ;X2ÿ,B(ÿ^Jÿÿ ÿsK+ÿÿŽcBÿc@ÿ•hEÿ‹_<ÿ‡\9ÿÿÿðððÿñññÿóóóÿóóóÿôôôÿôôôÿõõõÿõõõÿöööÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿùùùÿùùùÿúúúÿúúúÿûûûÿûûûÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿdCÿdAÿ£tOÿŽ]6ÿ•b:ÿ›g>ÿÿ§sJÿi@ÿ‡S*ÿ™e<ÿ—c:ÿ¬xOÿ¬xOÿ©vMÿ©wOÿcD+ÿI3"ÿ‰X3ÿŠ\8ÿ{Q0ÿyQ1ÿ,*(ÿÿÿ•••ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿ^^^ÿÿÿE?9ÿmK0ÿnL2ÿ ÿ EÿvˆnÿNm<ÿFn ÿh‡Qÿ•ª[ÿvŒ?ÿ.cÿ~šeÿ\Hÿ5cÿWw7ÿƒ„_ÿ~’Rÿ!: ÿÿV;&ÿT7 ÿÿÌÌÌÿÛÛÛÿÿÄÄÄÿÌÌÌÿÐÐÐÿÑÑÑÿÑÑÑÿÒÒÒÿÒÒÒÿÒÒÒÿÒÒÒÿ444ÿ———ÿÓÓÓÿÔÔÔÿÔÔÔÿÔÔÔÿìììÿôôôÿôôôÿõõõÿõõõÿzzzÿ{{{ÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿøøøÿùùùÿÿðððÿÿÿÿÿÿuP3ÿ‚Y8ÿ”gDÿ˜gAÿªwNÿ™e<ÿœh?ÿ¦rIÿ§sJÿ¬xOÿbE-ÿ%ÿqI*ÿšf=ÿ¢nEÿ¥qHÿ¤qHÿ£qJÿžmFÿ¡pIÿÿÿÀÀÀÿ¼¼¼ÿ¹¹¹ÿ»»»ÿ¸¸¸ÿ30.ÿ~P-ÿ‚V3ÿL3 ÿfG-ÿN7$ÿÿ'ÿ!0#ÿ"ÿBc7ÿ-ÿ)@%ÿr¬Xÿd—LÿÿW9#ÿÿˆ];ÿc@ÿ‘eBÿdBÿbAÿÿÿðððÿñññÿóóóÿóóóÿôôôÿôôôÿõõõÿõõõÿöööÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿùùùÿùùùÿúúúÿúúúÿûûûÿûûûÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…]=ÿˆ]<ÿ•hDÿ]7ÿjBÿ§sJÿÿ¬xOÿ¯{Rÿ¢nEÿ[2ÿ lCÿ¥qHÿ¥qHÿ¤pGÿªwNÿ mDÿ5%ÿnI+ÿ^8ÿŠ_<ÿ‚Y9ÿ-+)ÿÿÿ–––ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿcccÿÿÿH?8ÿeC(ÿhH-ÿÿ- ÿ =ÿŸ¨™ÿÊÒ®ÿŠŸ}ÿX~'ÿq‘EÿeƒTÿgŠ3ÿ2]ÿNr%ÿ¤uÿtƒTÿÿˆ];ÿˆ_?ÿÿÿðððÿñññÿóóóÿóóóÿôôôÿôôôÿõõõÿõõõÿöööÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿùùùÿùùùÿúúúÿúúúÿûûûÿûûûÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxR4ÿŠaAÿ“gDÿ“c>ÿ mFÿ£oFÿÿ¡mDÿ¡mDÿ”`7ÿ–b9ÿŽZ1ÿi@ÿi@ÿœh?ÿ©uLÿ¯{Rÿ¡pJÿ(ÿ•d>ÿŒ_<ÿV5ÿ.+)ÿÿÿ–––ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿcccÿÿÿE<5ÿb?#ÿX9!ÿÿUg.ÿ%> ÿBÿ-PÿaQ:ÿp‰KÿhyEÿSg<ÿ%Nÿp‡fÿºÃ¶ÿXrMÿ'ÿÿÿ%%ÿ' ÿ]<"ÿÿOOOÿ!!!ÿÏÏÏÿóóóÿúúúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???ÿÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿYYYÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÿÿïïïÿÿiD'ÿvL*ÿ†Y4ÿ]6ÿ•c:ÿ•b9ÿ’_6ÿ‘^5ÿ“`7ÿ…R)ÿL#ÿÿ, ÿŽ[2ÿ\3ÿ•b9ÿ’`8ÿŒ[4ÿŽ]7ÿ^8ÿÿÿ¿¿¿ÿ»»»ÿ···ÿ¸¸¸ÿ···ÿ0-,ÿ{N*ÿT2ÿ|Q0ÿJ/ÿ ÿ ÿÿ ÿ ÿÿCh>ÿ'ÿÿ"6ÿ ÿE,ÿÿzO-ÿ|Q.ÿ}R.ÿ|R1ÿvO/ÿÿÿðððÿñññÿóóóÿóóóÿôôôÿôôôÿõõõÿõõõÿöööÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿùùùÿùùùÿúúúÿúúúÿûûûÿûûûÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiF)ÿrK,ÿ€V4ÿ„V1ÿŽ\4ÿ‘^5ÿÿ‡T+ÿN%ÿŠW.ÿ{GÿŽ[2ÿ]4ÿ“`7ÿ\3ÿ—d;ÿ”a8ÿ—d;ÿI0ÿU7ÿ}P-ÿwN-ÿ,*(ÿÿÿ–––ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿñññÿàààÿÏÏÏÿbbbÿÿÿI@9ÿnL1ÿsO4ÿ$ÿÿ ÿÿÿR ÿt_Fÿ¹Ä´ÿ²¾­ÿ–¢‘ÿœ†ÿ?ÿ/ ÿÿgH/ÿfE+ÿlK0ÿiH.ÿhG-ÿ8'ÿ'ÿ...ÿÒÒÒÿõõõÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???ÿœœœÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ///ÿÿÿzT5ÿŠa?ÿ‹];ÿ“b>ÿmFÿŸnGÿ¡pIÿ¥tMÿ©xQÿ¢qJÿlEÿ ÿÿÿÿÿÿÿÿÿÿEEEÿ···ÿ³³³ÿ¯¯¯ÿ°°°ÿ¯¯¯ÿ2/-ÿ’hFÿˆ^=ÿ‡^=ÿ ÿÿ/ÿsM1ÿ ÿ7&ÿ'ÿ?\9ÿÿI1ÿ%ÿÿ*ÿÿŒbAÿ‡\;ÿŠa?ÿ|S4ÿvP3ÿÿÿðððÿòòòÿóóóÿóóóÿôôôÿôôôÿõõõÿõõõÿöööÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿùùùÿùùùÿúúúÿúúúÿûûûÿûûûÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfE+ÿuP3ÿ„[;ÿŽb?ÿ£tNÿ§vOÿÿ¥tMÿ¢qJÿ™gAÿ¥tMÿ¤sLÿ¦uNÿ›jDÿ£rKÿ™gAÿ™gAÿlEÿ€X9ÿ/ ÿŽdBÿŠbBÿ-+)ÿÿÿ•••ÿËËËÿÙÙÙÿëëëÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿòòòÿáááÿÑÑÑÿdddÿÿÿJB;ÿ€]Bÿ|Y=ÿƒ_CÿY@,ÿ@. ÿV?-ÿ*ÿ07ÿ9Sÿ Eÿ@ÿ ÿSf$ÿ#0ÿ ÿiL6ÿtU<ÿzY>ÿxV;ÿ|[?ÿ~\BÿvU:ÿ[A+ÿÿÔÔÔÿ÷÷÷ÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???ÿ‚‚‚ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ???ÿ³³³ÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿÿkM6ÿÿˆaCÿ“jIÿ•iGÿ¦yUÿ£uPÿ¯\ÿ¦wRÿ›lGÿ¥vQÿnIÿ”e@ÿ‰Z5ÿ?-ÿ|X=ÿª{Vÿ¢sNÿ§yUÿ˜kGÿ¤wTÿƒ^BÿÿŽŽŽÿ¯¯¯ÿ¬¬¬ÿ¨¨¨ÿ©©©ÿ¨¨¨ÿ0.+ÿfDÿ–mMÿŠaBÿ ÿ‡`@ÿŽgHÿ‡aCÿqS;ÿ„_Bÿ\A-ÿÿ ÿzU9ÿoI,ÿ*ÿ*ÿÿeEÿ™pOÿ’jIÿhJÿ‚]Aÿÿÿñññÿòòòÿóóóÿóóóÿôôôÿôôôÿõõõÿõõõÿöööÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿùùùÿùùùÿúúúÿúúúÿûûûÿûûûÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrR8ÿ€\@ÿfGÿrQÿoKÿ˜iDÿÿ™jEÿ—hCÿ‹\7ÿ©zUÿ©zUÿ§xSÿ¤uPÿ¨yTÿ¡rMÿ­~Yÿ¦wRÿ­[ÿ ÿ‡^>ÿŠcDÿ,)'ÿÿÿ•••ÿÍÍÍÿÚÚÚÿìììÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿôôôÿåååÿÖÖÖÿfffÿÿÿPF>ÿ}Y<ÿ~Y=ÿ~Y<ÿ}X:ÿ|X;ÿvS7ÿM5#ÿ ÿ(? +ÿ ÿ#ÿ6$ÿ$ÿÿR;)ÿkL2ÿvU:ÿwT8ÿuQ6ÿzW:ÿwS7ÿuR6ÿxT9ÿL5#ÿÿÿÿÿÿÿÿÿÿÿ/"ÿ ÿÿÿÿÿÿÿÿÿÿ ÿ1$ÿ ÿ ÿÿ +ÿ ÿ ÿ ÿ ÿ ÿ ÿ2#ÿcB(ÿÿ‰aAÿtRÿ˜kIÿ•gDÿžpKÿ—iDÿª{Wÿ¦xSÿ¢tPÿ¢sOÿ rMÿ’d@ÿS<)ÿ<'ÿžpKÿ¢tPÿ¨{Wÿ˜kHÿ—jGÿ™mJÿ444ÿ®®®ÿ®®®ÿ«««ÿ¨¨¨ÿ©©©ÿ¨¨¨ÿ1.,ÿyO.ÿ‡^>ÿbE/ÿ$ÿ†^>ÿ‡`Aÿƒ]>ÿ„]@ÿ€[=ÿlN9ÿÿ1#ÿ{U8ÿpI,ÿ„^?ÿrJ+ÿÿ\?ÿ‘fFÿfFÿ‡`@ÿ~Y;ÿÿÿòòòÿòòòÿóóóÿóóóÿôôôÿôôôÿõõõÿõõõÿöööÿöööÿöööÿ÷÷÷ÿ÷÷÷ÿøøøÿøøøÿùùùÿùùùÿúúúÿúúúÿûûûÿûûûÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvT:ÿvR4ÿŽgGÿ‡];ÿ¡tPÿfGÿÿškGÿ rMÿ¢sOÿžpKÿŠ[7ÿŸqLÿ rMÿ­Zÿ rMÿ™jFÿŸqLÿ–hDÿ)ÿgI3ÿŒdEÿ.+)ÿÿÿ™™™ÿÒÒÒÿßßßÿïïïÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿõõõÿèèèÿÜÜÜÿkkkÿÿÿ.,,ÿVQLÿUOKÿVQNÿVQMÿTOKÿPLHÿOJGÿ + ÿÿÿ@=:ÿEB>ÿ1.+ÿ-*(ÿIDBÿLGDÿNIFÿPLHÿRMIÿROJÿSOKÿTOKÿSNIÿOKHÿMIEÿKFCÿIFBÿIEAÿIEAÿIEAÿIEAÿIDBÿIDBÿIEAÿHDAÿHEAÿJFBÿIEAÿIDAÿHDAÿHCAÿHDAÿIDBÿIEBÿJFBÿIEBÿJFBÿJFBÿJFCÿIEBÿJFBÿJFCÿJFBÿJFBÿIFBÿLGDÿNJFÿRMIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTOKÿga\ÿf`\ÿc^Yÿe_[ÿd^Yÿÿiiiÿiiiÿgggÿfffÿfffÿfffÿÿ_ZVÿ^XTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_YUÿ]XTÿZUQÿVRMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿPKGÿUPMÿXTOÿ_YUÿd_[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\VRÿÿÿÿŸŸŸÿÙÙÙÿãããÿñññÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ÷÷÷ÿìììÿâââÿoooÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ÿßßßÿèèèÿôôôÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùùùÿñññÿèèèÿâââÿÞÞÞÿØØØÿÑÑÑÿÌÌÌÿÌÌÌÿÌÌÌÿËËËÿÉÉÉÿÃÃÃÿ¿¿¿ÿ»»»ÿ¶¶¶ÿ²²²ÿ±±±ÿ±±±ÿ³³³ÿ´´´ÿ¶¶¶ÿ»»»ÿÀÀÀÿÅÅÅÿÊÊÊÿÍÍÍÿÏÏÏÿÏÏÏÿÏÏÏÿÍÍÍÿËËËÿÉÉÉÿÆÆÆÿÃÃÃÿÂÂÂÿÂÂÂÿÂÂÂÿÃÃÃÿÃÃÃÿÃÃÃÿÃÃÃÿÃÃÃÿÃÃÃÿÃÃÃÿÃÃÃÿÃÃÃÿÂÂÂÿÂÂÂÿÃÃÃÿÃÃÃÿÃÃÃÿÄÄÄÿÄÄÄÿÅÅÅÿÆÆÆÿÆÆÆÿÆÆÆÿÆÆÆÿÆÆÆÿÆÆÆÿÇÇÇÿÊÊÊÿÍÍÍÿÑÑÑÿºººÿ½½½ÿÛÛÛÿßßßÿâââÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿÕÕÕÿ«««ÿãããÿãããÿâââÿàààÿßßßÿßßßÿßßßÿßßßÿßßßÿÝÝÝÿÜÜÜÿÜÜÜÿÛÛÛÿÚÚÚÿØØØÿÖÖÖÿ¬¬¬ÿ¸¸¸ÿÑÑÑÿÏÏÏÿÍÍÍÿËËËÿÊÊÊÿÉÉÉÿÉÉÉÿÊÊÊÿÊÊÊÿËËËÿÌÌÌÿÏÏÏÿÄÄÄÿ¬¬¬ÿÕÕÕÿÖÖÖÿÒÒÒÿÌÌÌÿÆÆÆÿÂÂÂÿ»»»ÿ´´´ÿ¬¬¬ÿ©©©ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ¨¨¨ÿ©©©ÿ¬¬¬ÿ´´´ÿ»»»ÿÃÃÃÿËËËÿÒÒÒÿÚÚÚÿáááÿ¹¹¹ÿÕÕÕÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿâââÿÃÃÃÿ±±±ÿÕÕÕÿÖÖÖÿÙÙÙÿÝÝÝÿàààÿåååÿíííÿöööÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿõõõÿîîîÿéééÿæææÿàààÿÛÛÛÿÖÖÖÿÔÔÔÿÓÓÓÿÒÒÒÿÏÏÏÿËËËÿÈÈÈÿÄÄÄÿÁÁÁÿ½½½ÿ¼¼¼ÿ¼¼¼ÿ¾¾¾ÿ¿¿¿ÿÂÂÂÿÆÆÆÿÊÊÊÿÎÎÎÿÒÒÒÿÔÔÔÿØØØÿÙÙÙÿÚÚÚÿÙÙÙÿØØØÿ×××ÿÖÖÖÿÔÔÔÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÓÓÓÿÔÔÔÿÔÔÔÿÕÕÕÿÕÕÕÿÖÖÖÿÖÖÖÿÖÖÖÿÖÖÖÿÖÖÖÿÖÖÖÿ×××ÿØØØÿÚÚÚÿÛÛÛÿÜÜÜÿßßßÿáááÿâââÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿâââÿáááÿáááÿáááÿáááÿáááÿáááÿàààÿßßßÿßßßÿßßßÿÝÝÝÿÜÜÜÿÚÚÚÿÙÙÙÿ×××ÿÖÖÖÿÔÔÔÿÓÓÓÿÑÑÑÿÏÏÏÿÏÏÏÿÏÏÏÿÏÏÏÿÏÏÏÿÑÑÑÿÒÒÒÿÓÓÓÿÔÔÔÿÖÖÖÿØØØÿÙÙÙÿÕÕÕÿÒÒÒÿÐÐÐÿËËËÿÇÇÇÿÂÂÂÿ¼¼¼ÿºººÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿºººÿ¼¼¼ÿÂÂÂÿÇÇÇÿÌÌÌÿÒÒÒÿ×××ÿÜÜÜÿáááÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿâââÿàààÿÝÝÝÿÜÜÜÿÝÝÝÿàààÿäääÿèèèÿìììÿòòòÿøøøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿøøøÿôôôÿñññÿîîîÿéééÿåååÿâââÿàààÿÞÞÞÿÝÝÝÿÙÙÙÿÕÕÕÿÔÔÔÿÑÑÑÿÍÍÍÿËËËÿÊÊÊÿËËËÿËËËÿÌÌÌÿÏÏÏÿÒÒÒÿÕÕÕÿÙÙÙÿÛÛÛÿÝÝÝÿàààÿãããÿäääÿåååÿäääÿäääÿãããÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿâââÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿãããÿäääÿäääÿäääÿåååÿåååÿåååÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿåååÿäääÿãããÿãããÿáááÿàààÿßßßÿÝÝÝÿÝÝÝÿÜÜÜÿÚÚÚÿÙÙÙÿØØØÿ×××ÿ×××ÿ×××ÿØØØÿÙÙÙÿÚÚÚÿÚÚÚÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿÜÜÜÿÚÚÚÿØØØÿÕÕÕÿÒÒÒÿÏÏÏÿÍÍÍÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÌÌÌÿÍÍÍÿÏÏÏÿÓÓÓÿÖÖÖÿÙÙÙÿÝÝÝÿßßßÿâââÿåååÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿæææÿåååÿäääÿäääÿæææÿéééÿìììÿïïïÿòòòÿ÷÷÷ÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûûûÿùùùÿ÷÷÷ÿõõõÿôôôÿñññÿðððÿïïïÿìììÿêêêÿèèèÿæææÿäääÿâââÿàààÿàààÿàààÿàààÿáááÿâââÿåååÿçççÿêêêÿëëëÿíííÿðððÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿðððÿðððÿïïïÿïïïÿîîîÿìììÿìììÿëëëÿëëëÿêêêÿéééÿèèèÿèèèÿèèèÿéééÿêêêÿêêêÿêêêÿëëëÿëëëÿíííÿîîîÿïïïÿîîîÿîîîÿîîîÿíííÿëëëÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿêêêÿëëëÿìììÿíííÿîîîÿðððÿñññÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿñññÿñññÿòòòÿôôôÿöööÿøøøÿúúúÿûûûÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿýýýÿýýýÿýýýÿüüüÿûûûÿùùùÿøøøÿ÷÷÷ÿöööÿõõõÿôôôÿôôôÿôôôÿôôôÿôôôÿõõõÿöööÿøøøÿùùùÿúúúÿûûûÿüüüÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿüüüÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿúúúÿúúúÿûûûÿüüüÿüüüÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿýýýÿýýýÿýýýÿüüüÿüüüÿüüüÿüüüÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_best_compression.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_best_compression.png new file mode 100644 index 00000000..d0d34b44 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_best_compression.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_fast_rgba.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_fast_rgba.png new file mode 100644 index 00000000..cd514b28 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_fast_rgba.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_reference.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_reference.png new file mode 100644 index 00000000..b65571d7 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/pixelstream_reference.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/rect.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/rect.png new file mode 100644 index 00000000..c61cac7f Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/rect.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/replaced.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/replaced.png new file mode 100644 index 00000000..d050c583 Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/replaced.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/text_chunk.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/text_chunk.png new file mode 100644 index 00000000..5cba639c Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/text_chunk.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/ztxt_chunk.png b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/ztxt_chunk.png new file mode 100644 index 00000000..b4401c9c Binary files /dev/null and b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/resources/ztxt_chunk.png differ diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/spec/spec_helper.rb b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/spec_helper.rb new file mode 100644 index 00000000..96aaef88 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/spec/spec_helper.rb @@ -0,0 +1,47 @@ +require 'rubygems' +require 'bundler' + +Bundler.require(:default, :development) + +module PNGSuite + + def png_suite_file(kind, file) + File.join(png_suite_dir(kind), file) + end + + def png_suite_dir(kind) + File.expand_path("./png_suite/#{kind}", File.dirname(__FILE__)) + end + + def png_suite_files(kind, pattern = '*.png') + Dir[File.join(png_suite_dir(kind), pattern)] + end +end + + +module ResourceFileHelper + + def resource_file(name) + File.expand_path("./resources/#{name}", File.dirname(__FILE__)) + end + + def reference_canvas(name) + ChunkyPNG::Canvas.from_file(resource_file("#{name}.png")) + end + + def reference_image(name) + ChunkyPNG::Image.from_file(resource_file("#{name}.png")) + end + + def display(canvas) + filename = resource_file('_tmp.png') + canvas.to_datastream.save(filename) + `open #{filename}` + end +end + +RSpec.configure do |config| + config.extend PNGSuite + config.include PNGSuite + config.include ResourceFileHelper +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/tasks/benchmarks.rake b/lib/ruby/gem/gems/chunky_png-0.11.1/tasks/benchmarks.rake new file mode 100644 index 00000000..80d92f4b --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/tasks/benchmarks.rake @@ -0,0 +1,26 @@ +all_benchamrk_tasks = [] + +namespace(:benchmark) do + + Dir[File.join(File.dirname(__FILE__), '..', 'benchmarks', '*_benchmark.rb')]. each do |benchmark_file| + task_name = File.basename(benchmark_file, '_benchmark.rb').to_sym + + desc "Run the #{task_name} benchmark." + task(task_name, :n) do |task, args| + ENV['N'] = args[:n] if args[:n] + load(File.expand_path(benchmark_file)) + end + + all_benchamrk_tasks << "benchmark:#{task_name}" + end +end + +unless all_benchamrk_tasks.empty? + desc 'Run the whole benchmark suite' + task(:benchmark, :n) do |task, args| + all_benchamrk_tasks.each do |t| + task(t).invoke(args[:n]) + puts + end + end +end diff --git a/lib/ruby/gem/gems/chunky_png-0.11.1/tasks/github-gem.rake b/lib/ruby/gem/gems/chunky_png-0.11.1/tasks/github-gem.rake new file mode 100644 index 00000000..acc50f24 --- /dev/null +++ b/lib/ruby/gem/gems/chunky_png-0.11.1/tasks/github-gem.rake @@ -0,0 +1,361 @@ +require 'rubygems' +require 'rake' +require 'rake/tasklib' +require 'date' +require 'set' + +module GithubGem + + # Detects the gemspc file of this project using heuristics. + def self.detect_gemspec_file + FileList['*.gemspec'].first + end + + # Detects the main include file of this project using heuristics + def self.detect_main_include + if detect_gemspec_file =~ /^(\.*)\.gemspec$/ && File.exist?("lib/#{$1}.rb") + "lib/#{$1}.rb" + elsif FileList['lib/*.rb'].length == 1 + FileList['lib/*.rb'].first + else + nil + end + end + + class RakeTasks + + attr_reader :gemspec, :modified_files + attr_accessor :gemspec_file, :task_namespace, :main_include, :root_dir, :spec_pattern, :test_pattern, :remote, :remote_branch, :local_branch + + # Initializes the settings, yields itself for configuration + # and defines the rake tasks based on the gemspec file. + def initialize(task_namespace = :gem) + @gemspec_file = GithubGem.detect_gemspec_file + @task_namespace = task_namespace + @main_include = GithubGem.detect_main_include + @modified_files = Set.new + @root_dir = Dir.pwd + @test_pattern = 'test/**/*_test.rb' + @spec_pattern = 'spec/**/*_spec.rb' + @local_branch = 'master' + @remote = 'origin' + @remote_branch = 'master' + + yield(self) if block_given? + + load_gemspec! + define_tasks! + end + + protected + + def git + @git ||= ENV['GIT'] || 'git' + end + + # Define Unit test tasks + def define_test_tasks! + require 'rake/testtask' + + namespace(:test) do + Rake::TestTask.new(:basic) do |t| + t.pattern = test_pattern + t.verbose = true + t.libs << 'test' + end + end + + desc "Run all unit tests for #{gemspec.name}" + task(:test => ['test:basic']) + end + + # Defines RSpec tasks + def define_rspec_tasks! + require 'rspec/core/rake_task' + + namespace(:spec) do + desc "Verify all RSpec examples for #{gemspec.name}" + RSpec::Core::RakeTask.new(:basic) do |t| + t.pattern = spec_pattern + end + + desc "Verify all RSpec examples for #{gemspec.name} and output specdoc" + RSpec::Core::RakeTask.new(:specdoc) do |t| + t.pattern = spec_pattern + t.rspec_opts = ['--format', 'documentation', '--color'] + end + + desc "Run RCov on specs for #{gemspec.name}" + RSpec::Core::RakeTask.new(:rcov) do |t| + t.pattern = spec_pattern + t.rcov = true + t.rcov_opts = ['--exclude', '"spec/*,gems/*"', '--rails'] + end + end + + desc "Verify all RSpec examples for #{gemspec.name} and output specdoc" + task(:spec => ['spec:specdoc']) + end + + # Defines the rake tasks + def define_tasks! + + define_test_tasks! if has_tests? + define_rspec_tasks! if has_specs? + + namespace(@task_namespace) do + desc "Updates the filelist in the gemspec file" + task(:manifest) { manifest_task } + + desc "Builds the .gem package" + task(:build => :manifest) { build_task } + + desc "Sets the version of the gem in the gemspec" + task(:set_version => [:check_version, :check_current_branch]) { version_task } + task(:check_version => :fetch_origin) { check_version_task } + + task(:fetch_origin) { fetch_origin_task } + task(:check_current_branch) { check_current_branch_task } + task(:check_clean_status) { check_clean_status_task } + task(:check_not_diverged => :fetch_origin) { check_not_diverged_task } + + checks = [:check_current_branch, :check_clean_status, :check_not_diverged, :check_version] + checks.unshift('spec:basic') if has_specs? + checks.unshift('test:basic') if has_tests? + # checks.push << [:check_rubyforge] if gemspec.rubyforge_project + + desc "Perform all checks that would occur before a release" + task(:release_checks => checks) + + release_tasks = [:release_checks, :set_version, :build, :github_release, :gemcutter_release] + # release_tasks << [:rubyforge_release] if gemspec.rubyforge_project + + desc "Release a new version of the gem using the VERSION environment variable" + task(:release => release_tasks) { release_task } + + namespace(:release) do + desc "Release the next version of the gem, by incrementing the last version segment by 1" + task(:next => [:next_version] + release_tasks) { release_task } + + desc "Release the next version of the gem, using a patch increment (0.0.1)" + task(:patch => [:next_patch_version] + release_tasks) { release_task } + + desc "Release the next version of the gem, using a minor increment (0.1.0)" + task(:minor => [:next_minor_version] + release_tasks) { release_task } + + desc "Release the next version of the gem, using a major increment (1.0.0)" + task(:major => [:next_major_version] + release_tasks) { release_task } + end + + # task(:check_rubyforge) { check_rubyforge_task } + # task(:rubyforge_release) { rubyforge_release_task } + task(:gemcutter_release) { gemcutter_release_task } + task(:github_release => [:commit_modified_files, :tag_version]) { github_release_task } + task(:tag_version) { tag_version_task } + task(:commit_modified_files) { commit_modified_files_task } + + task(:next_version) { next_version_task } + task(:next_patch_version) { next_version_task(:patch) } + task(:next_minor_version) { next_version_task(:minor) } + task(:next_major_version) { next_version_task(:major) } + + desc "Updates the gem release tasks with the latest version on Github" + task(:update_tasks) { update_tasks_task } + end + end + + # Updates the files list and test_files list in the gemspec file using the list of files + # in the repository and the spec/test file pattern. + def manifest_task + # Load all the gem's files using "git ls-files" + repository_files = `#{git} ls-files`.split("\n") + test_files = Dir[test_pattern] + Dir[spec_pattern] + + update_gemspec(:files, repository_files) + update_gemspec(:test_files, repository_files & test_files) + end + + # Builds the gem + def build_task + sh "gem build -q #{gemspec_file}" + Dir.mkdir('pkg') unless File.exist?('pkg') + sh "mv #{gemspec.name}-#{gemspec.version}.gem pkg/#{gemspec.name}-#{gemspec.version}.gem" + end + + def newest_version + `#{git} tag`.split("\n").map { |tag| tag.split('-').last }.compact.map { |v| Gem::Version.new(v) }.max || Gem::Version.new('0.0.0') + end + + def next_version(increment = nil) + next_version = newest_version.segments + increment_index = case increment + when :micro then 3 + when :patch then 2 + when :minor then 1 + when :major then 0 + else next_version.length - 1 + end + + next_version[increment_index] ||= 0 + next_version[increment_index] = next_version[increment_index].succ + ((increment_index + 1)...next_version.length).each { |i| next_version[i] = 0 } + + Gem::Version.new(next_version.join('.')) + end + + def next_version_task(increment = nil) + ENV['VERSION'] = next_version(increment).version + puts "Releasing version #{ENV['VERSION']}..." + end + + # Updates the version number in the gemspec file, the VERSION constant in the main + # include file and the contents of the VERSION file. + def version_task + update_gemspec(:version, ENV['VERSION']) if ENV['VERSION'] + update_gemspec(:date, Date.today) + + update_version_file(gemspec.version) + update_version_constant(gemspec.version) + end + + def check_version_task + raise "#{ENV['VERSION']} is not a valid version number!" if ENV['VERSION'] && !Gem::Version.correct?(ENV['VERSION']) + proposed_version = Gem::Version.new(ENV['VERSION'].dup || gemspec.version) + raise "This version (#{proposed_version}) is not higher than the highest tagged version (#{newest_version})" if newest_version >= proposed_version + end + + # Checks whether the current branch is not diverged from the remote branch + def check_not_diverged_task + raise "The current branch is diverged from the remote branch!" if `#{git} rev-list HEAD..#{remote}/#{remote_branch}`.split("\n").any? + end + + # Checks whether the repository status ic clean + def check_clean_status_task + raise "The current working copy contains modifications" if `#{git} ls-files -m`.split("\n").any? + end + + # Checks whether the current branch is correct + def check_current_branch_task + raise "Currently not on #{local_branch} branch!" unless `#{git} branch`.split("\n").detect { |b| /^\* / =~ b } == "* #{local_branch}" + end + + # Fetches the latest updates from Github + def fetch_origin_task + sh git, 'fetch', remote + end + + # Commits every file that has been changed by the release task. + def commit_modified_files_task + really_modified = `#{git} ls-files -m #{modified_files.entries.join(' ')}`.split("\n") + if really_modified.any? + really_modified.each { |file| sh git, 'add', file } + sh git, 'commit', '-m', "Released #{gemspec.name} gem version #{gemspec.version}." + end + end + + # Adds a tag for the released version + def tag_version_task + sh git, 'tag', '-a', "#{gemspec.name}-#{gemspec.version}", '-m', "Released #{gemspec.name} gem version #{gemspec.version}." + end + + # Pushes the changes and tag to github + def github_release_task + sh git, 'push', '--tags', remote, remote_branch + end + + def gemcutter_release_task + sh "gem", 'push', "pkg/#{gemspec.name}-#{gemspec.version}.gem" + end + + # Gem release task. + # All work is done by the task's dependencies, so just display a release completed message. + def release_task + puts + puts "Release successful." + end + + private + + # Checks whether this project has any RSpec files + def has_specs? + FileList[spec_pattern].any? + end + + # Checks whether this project has any unit test files + def has_tests? + FileList[test_pattern].any? + end + + # Loads the gemspec file + def load_gemspec! + @gemspec = eval(File.read(@gemspec_file)) + end + + # Updates the VERSION file with the new version + def update_version_file(version) + if File.exists?('VERSION') + File.open('VERSION', 'w') { |f| f << version.to_s } + modified_files << 'VERSION' + end + end + + # Updates the VERSION constant in the main include file if it exists + def update_version_constant(version) + if main_include && File.exist?(main_include) + file_contents = File.read(main_include) + if file_contents.sub!(/^(\s+VERSION\s*=\s*)[^\s].*$/) { $1 + version.to_s.inspect } + File.open(main_include, 'w') { |f| f << file_contents } + modified_files << main_include + end + end + end + + # Updates an attribute of the gemspec file. + # This function will open the file, and search/replace the attribute using a regular expression. + def update_gemspec(attribute, new_value, literal = false) + + unless literal + new_value = case new_value + when Array then "%w(#{new_value.join(' ')})" + when Hash, String then new_value.inspect + when Date then new_value.strftime('%Y-%m-%d').inspect + else raise "Cannot write value #{new_value.inspect} to gemspec file!" + end + end + + spec = File.read(gemspec_file) + regexp = Regexp.new('^(\s+\w+\.' + Regexp.quote(attribute.to_s) + '\s*=\s*)[^\s].*$') + if spec.sub!(regexp) { $1 + new_value } + File.open(gemspec_file, 'w') { |f| f << spec } + modified_files << gemspec_file + + # Reload the gemspec so the changes are incorporated + load_gemspec! + + # Also mark the Gemfile.lock file as changed because of the new version. + modified_files << 'Gemfile.lock' if File.exist?(File.join(root_dir, 'Gemfile.lock')) + end + end + + # Updates the tasks file using the latest file found on Github + def update_tasks_task + require 'net/http' + + server = 'github.com' + path = '/wvanbergen/github-gem/raw/master/tasks/github-gem.rake' + + Net::HTTP.start(server) do |http| + response = http.get(path) + open(__FILE__, "w") { |file| file.write(response.body) } + end + + relative_file = File.expand_path(__FILE__).sub(%r[^#{@root_dir}/], '') + if `#{git} ls-files -m #{relative_file}`.split("\n").any? + sh git, 'add', relative_file + sh git, 'commit', '-m', "Updated to latest gem release management tasks." + else + puts "Release managament tasks already are at the latest version." + end + end + end +end diff --git a/lib/ruby/gem/gems/compass-0.10.6/LICENSE.markdown b/lib/ruby/gem/gems/compass-0.10.6/LICENSE.markdown new file mode 100644 index 00000000..8e61ae60 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/LICENSE.markdown @@ -0,0 +1,29 @@ +Copyright (c) 2009 Christopher M. Eppstein + +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. +No attribution is required by products that make use of this 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. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the sale, +use or other dealings in this Software without prior written authorization. + +Contributors to this project agree to grant all rights to the copyright +holder of the primary product. Attribution is maintained in the source +control history of the product. diff --git a/lib/ruby/gem/gems/compass-0.10.6/README.markdown b/lib/ruby/gem/gems/compass-0.10.6/README.markdown new file mode 100644 index 00000000..0b04d84f --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/README.markdown @@ -0,0 +1,56 @@ +# Compass +A [Sass][sass]-based CSS Meta-Framework that allows you to mix and match any of the following CSS frameworks: + +- [Compass Core][compass_core_website] - [Wiki Documentation][compass_core_wiki] +- [Blueprint][blueprint_website] - [Wiki Documentation][bleuprint_wiki] +- [960][ninesixty_website] - [Wiki Documentation][ninesixty_wiki] +- [Susy][susy_website] - [Wiki Documentation][susy_wiki] +- [YUI][yui_website] - [Wiki Documentation][yui_wiki] +- New frameworks and extensions are [tracked on the wiki][plugins_wiki] as they are created. +- Other frameworks can be added relatively easily. Create your own! + +## Compass Provides + +1. A [command line tool][command_line_wiki] for managing your Sass projects. +2. Simple integration with [Ruby-on-Rails][ruby_on_rails_wiki], [Merb][merb_wiki], [StaticMatic][static_matic_wiki], and even [non-ruby application servers][command_line_wiki]. +3. Loads of Sass mixins to make building your website a snap. + +## Quick Start + + $ (sudo) gem install compass + $ compass create my_compass_project --using blueprint + $ cd my_compass_project + $ compass watch + +## More Information +Please see the [wiki][wiki] + +## Author +Compass is written by [Chris Eppstein][chris_eppstein].
+Chris is the Software Architect of [Caring.com][caring.com] and a member of the [Sass][sass] core team. + +## License +Copyright (c) 2008-2009 Christopher M. Eppstein
+All Rights Reserved.
+Released under a [slightly modified MIT License][license]. + +[sass]: http://sass-lang.com/ "Syntactically Awesome StyleSheets" +[compass_core_website]: http://github.com/chriseppstein/compass/tree/master/frameworks/compass +[compass_core_wiki]: http://github.com/chriseppstein/compass/wikis/compass-core-documentation +[blueprint_website]: http://blueprintcss.org/ +[bleuprint_wiki]: http://github.com/chriseppstein/compass/wikis/blueprint-documentation +[yui_website]: http://developer.yahoo.com/yui/grids/ +[yui_wiki]: http://github.com/chriseppstein/compass/wikis/yui-documentation +[plugins_wiki]: http://github.com/chriseppstein/compass/wikis/compass-plugins +[ninesixty_website]: http://960.gs/ +[ninesixty_wiki]: http://github.com/chriseppstein/compass/wikis/960gs-documentation +[command_line_wiki]: http://wiki.github.com/chriseppstein/compass/command-line-tool +[wiki]: http://github.com/chriseppstein/compass/wikis/home +[ruby_on_rails_wiki]: http://wiki.github.com/chriseppstein/compass/ruby-on-rails-integration +[merb_wiki]: http://wiki.github.com/chriseppstein/compass/merb-integration +[static_matic_wiki]: http://wiki.github.com/chriseppstein/compass/staticmatic-integration +[chris_eppstein]: http://chriseppstein.github.com +[caring.com]: http://www.caring.com/ "Senior Care Resources" +[license]: http://github.com/chriseppstein/compass/tree/master/LICENSE.markdown +[susy_website]: http://www.oddbird.net/susy/ +[susy_wiki]: http://github.com/chriseppstein/compass/wikis/susy-documentation \ No newline at end of file diff --git a/lib/ruby/gem/gems/compass-0.10.6/Rakefile b/lib/ruby/gem/gems/compass-0.10.6/Rakefile new file mode 100644 index 00000000..e67e036f --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/Rakefile @@ -0,0 +1,109 @@ +require 'rubygems' +require 'rake' +$:.unshift File.join(File.dirname(__FILE__), 'lib') +require 'compass' + +# ----- Default: Testing ------ + +task :default => :run_tests + +require 'rake/testtask' +require 'fileutils' + +Rake::TestTask.new :run_tests do |t| + t.libs << 'lib' + t.libs << 'test' + test_files = FileList['test/**/*_test.rb'] + test_files.exclude('test/rails/*', 'test/haml/*') + t.test_files = test_files + t.verbose = true +end +Rake::Task[:test].send(:add_comment, < haml_file) + puts " haml #{File.basename(basename)}" + output = open(basename,'w') + output.write(engine.render) + output.close + end + end +end + +namespace :examples do + desc "clean up the example directories" + task :clean do + puts "Cleaning Examples" + Dir.glob('examples/*/clean.rb').each do |cleaner| + load cleaner + end + end +end + +task "gemspec:generate" => "examples:clean" + +namespace :git do + task :clean do + sh "git", "clean", "-fdx" + end +end + + +begin + require 'cucumber/rake/task' + require 'rcov/rcovtask' + namespace :rcov do + Cucumber::Rake::Task.new(:cucumber) do |t| + t.rcov = true + t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/,features\/ --aggregate coverage.data} + t.rcov_opts << %[-o "coverage"] + end + + Rcov::RcovTask.new(:units) do |rcov| + rcov.libs << 'lib' + test_files = FileList['test/**/*_test.rb'] + test_files.exclude('test/rails/*', 'test/haml/*') + rcov.pattern = test_files + rcov.output_dir = 'coverage' + rcov.verbose = true + rcov.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/,features\/ --aggregate coverage.data} + rcov.rcov_opts << %[-o "coverage" --sort coverage] + end + + + desc "Run both specs and features to generate aggregated coverage" + task :all do |t| + rm "coverage.data" if File.exist?("coverage.data") + Rake::Task["rcov:units"].invoke + Rake::Task["rcov:cucumber"].invoke + end + end +rescue LoadError => e + puts "WARNING: #{e}" +end + diff --git a/lib/ruby/gem/gems/compass-0.10.6/VERSION.yml b/lib/ruby/gem/gems/compass-0.10.6/VERSION.yml new file mode 100644 index 00000000..2839e139 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/VERSION.yml @@ -0,0 +1,5 @@ +--- +:major: 0 +:minor: 10 +:patch: 6 +#:build: pre.1 diff --git a/lib/ruby/gem/gems/compass-0.10.6/bin/compass b/lib/ruby/gem/gems/compass-0.10.6/bin/compass new file mode 100644 index 00000000..f816f3e9 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/bin/compass @@ -0,0 +1,26 @@ +#!/usr/bin/env ruby +# The compass command line utility + +# This allows compass to run easily from a git checkout without install. +def fallback_load_path(path) + retried = false + begin + yield + rescue LoadError + unless retried + $: << path + retried = true + retry + end + raise + end +end + +fallback_load_path(File.join(File.dirname(__FILE__), '..', 'lib')) do + require 'compass' + require 'compass/exec' +end + + +command_line_class = Compass::Exec::Helpers.select_appropriate_command_line_ui(ARGV) +exit command_line_class.new(ARGV).run! diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/README.markdown b/lib/ruby/gem/gems/compass-0.10.6/examples/README.markdown new file mode 100644 index 00000000..b00d5709 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/README.markdown @@ -0,0 +1,4 @@ +To build the examples: + +1. You can run the compass command line from any particular compass example project +2. You can compile them all by running `rake examples` at the top of the project directory. \ No newline at end of file diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/config.rb b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/config.rb new file mode 100644 index 00000000..bbb651ed --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/config.rb @@ -0,0 +1,7 @@ +# Require any additional compass plugins here. +project_type = :stand_alone +css_dir = "stylesheets" +sass_dir = "src" +images_dir = "images" +output_style = :compact +relative_assets = true diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/images/grid.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/images/grid.png new file mode 100644 index 00000000..129d4a29 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/images/grid.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/index.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/index.html.haml new file mode 100644 index 00000000..3b25dc6e --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/index.html.haml @@ -0,0 +1,85 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint test pages + / + Framework CSS + %link{ :href => "stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "stylesheets/index.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "0", :border => "0", :cellpadding => "0" } + %tr + %th.span-6 + Test page + %th.span-8 + Main files tested + %th.span-10 + Description + %tr + %td + %a{ :href => "parts/grid.html" } + Grid + %td + %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/_grid.sass" } + grid.sass + %td + Tests classes provided by the grid module. + %tr.even + %td + %a{ :href => "parts/elements.html" } + Typography + %td + %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/_typography.sass" } + typography.sass + %td + Tests HTML elements which gets set in the typography module. + %tr + %td + %a{ :href => "parts/forms.html" } + Forms + %td + %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/_form.sass" } + form.sass + %td + Tests classes and default look provided by the form module. + %p + %em + %strong + Note about the css files: + These test files utilize the css files that are generated from + %a{ :href => "http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html" } + Sass templates + \. + In other words, if you change any of the source files, + you'll have to re-build them with + %code + rake examples + to see any changes. + .box + %p + For more information and help, try these resources: + %ul.bottom + %li + %a{ :href => "http://code.google.com/p/blueprintcss" } + The Blueprint home page. + %li + %a{ :href => "http://groups.google.com/group/blueprintcss" } + Our anything-goes mailing list. + %li + %a{ :href => "http://bjorkoy.com" } + The blog where news about Blueprint gets posted. + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "parts/valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/elements.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/elements.html.haml new file mode 100644 index 00000000..f6039e46 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/elements.html.haml @@ -0,0 +1,282 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint HTML Elements Tests + / + Framework CSS + %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "http://www.google.com" } + \<a> a + href + %p + %abbr{ :title => "extended abbr text should show when mouse over" } + \<abbr> abbr - extended text when mouseover. + %br + %acronym{ :title => "extended acronym text should show when mouse over" } + \<acronym> acronym - extended text when mouseover. + %address + \<address> + %br + Donald Duck + %br + Box 555 + %br + Disneyland + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore dolore. + .span-8 + %table{ :cellspacing => "0", :border => "0", :summary => "This is the summary text for this table.", :cellpadding => "0" } + %caption + %em + A standard test table with a caption, tr, td elements + %tr + %th.span-4 + Table Header One + %th.span-4.last + Table Header Two + %tr + %td + TD One + %td + TD Two + %tr + %td{ :colspan => "2" } + TD colspan 2 + %table{ :cellspacing => "0", :border => "0", :summary => "This is the summary text for this table.", :cellpadding => "0" } + %caption + %em + A test table with a thead, tfoot, and tbody elements + %thead + %tr + %th.span-4 + Table Header One + %th.span-4.last + Table Header Two + %tfoot + %tr + %td{ :colspan => "2" } + tfoot footer + %tbody + %tr + %td + TD One + %td + TD Two + %tr + %td + TD One + %td + TD Two + %tbody + %tr + %td + TD One + %td + TD Two + %tr + %td + TD One + %td + TD Two + .span-8.last + %pre + \<pre> + pre space1 + pre space1 + pre space2 + pre space2 + pre tab + pre tab + %code + \<code> + Not indented + indent1 + indent1 + indent2 + indent3 + %tt + \<tt> + This tt text should be monospaced + and + wrap as if + one line of text + even though the code has newlines, spaces, and tabs. + It should be the same size as <p> text. + %hr + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/forms.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/forms.html.haml new file mode 100644 index 00000000..741706c5 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/forms.html.haml @@ -0,0 +1,192 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint Forms Tests + / + Framework CSS + %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if lt IE 8]> "", :method => "post" } + %fieldset + %legend + Simple sample form + %p + %label{ :for => "dummy0" } + Text input (title) + %br + %input#dummy0.title{ :name => "dummy0", :type => "text", :value => "Field with class .title" } + %p + %label{ :for => "dummy1" } + Another field + %br + %input#dummy1.text{ :name => "dummy1", :type => "text", :value => "Field with class .text" } + %p + %label{ :for => "dummy2" } + Textarea + %br + %textarea#dummy2{ :name => "dummy2", :rows => "5", :cols => "20" } + %p + %input{ :type => "submit", :value => "Submit" } + %input{ :type => "reset", :value => "Reset" } + .span-12.last + .error + This is a <div> with the class + %strong + \.error + \. + %a{ :href => "#" } + Link + \. + .notice + This is a <div> with the class + %strong + \.notice + \. + %a{ :href => "#" } + Link + \. + .success + This is a <div> with the class + %strong + \.success + \. + %a{ :href => "#" } + Link + \. + %fieldset + %legend + Select, checkboxes, lists + %p + %label{ :for => "dummy3" } + Select field + %br + %select#dummy3{ :name => "dummy3" } + %option{ :value => "1" } + Ottawa + %option{ :value => "2" } + Calgary + %option{ :value => "3" } + Moosejaw + %p + %label{ :for => "dummy4" } + Select with groups + %br + %select#dummy4{ :name => "dummy4" } + %option + Favorite pet + %optgroup{ :label => "mammals" } + %option + dog + %option + cat + %option + rabbit + %option + horse + %optgroup{ :label => "reptiles" } + %option + iguana + %option + snake + %p + %label + Radio buttons + %br + %input{ :name => "example", :type => "radio" } + Radio one + %br + %input{ :name => "example", :type => "radio" } + Radio two + %br + %input{ :name => "example", :type => "radio" } + Radio three + %br + %p + %label + Checkboxes + %br + %input{ :type => "checkbox" } + Check one + %br + %input{ :type => "checkbox" } + Check two + %br + %input{ :type => "checkbox" } + Check three + %br + .span-24.last + %fieldset + %legend + Alignment + %p + %label{ :for => "dummy5" } + Select field + %select#dummy5{ :name => "dummy5" } + %option{ :value => "1" } + Ottawa + %option{ :value => "2" } + Calgary + %option{ :value => "3" } + Moosejaw + %p + %label{ :for => "dummy6" } + Text input (title) + %input#dummy6.title{ :name => "dummy6", :type => "text", :value => "Field with class .title" } + %p + %label{ :for => "dummy7" } + Select field + %select#dummy7{ :name => "dummy7" } + %option{ :value => "1" } + Ottawa + %option{ :value => "2" } + Calgary + %option{ :value => "3" } + Moosejaw + %label{ :for => "dummy8" } + Another field + %input#dummy8.text{ :name => "dummy8", :type => "text", :value => "Field with class .text" } + .span-24.last + %form.inline{ :action => "", :method => "post" } + %fieldset + %legend + A form with class "inline" + .span-3 + %label{ :for => "a" } + Label A: + %select#a{ :name => "a" } + %option{ :value => "0" } + All + .span-2 + some text + .span-3 + %input#o.checkbox{ :type => "checkbox", :name => "o", :value => "true", :checked => "checked" } + checkbox one + .span-3 + %label{ :for => "b" } + Label B: + %select#b{ :name => "b" } + %option{ :value => "0" } + All + .span-2 + %a{ :href => "" } + A Hyperlink + .span-8 + %input#q.text{ :type => "text", :name => "q", :value => "Field with class .text" } + .span-2.last + %input.button{ :type => "submit", :value => "submit" } + / WTF This doesn't render correctly without some space. +   + %hr + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/grid.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/grid.html.haml new file mode 100644 index 00000000..1e2f5f13 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/grid.html.haml @@ -0,0 +1,274 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint Grid Tests + / + Framework CSS + %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "test-small.jpg" } + .span-10.last + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2 + %img.push-2{ :src => "test-small.jpg" } + .span-10.last + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2 + %img.push-3{ :src => "test-small.jpg" } + .span-10.last + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2 + %img.push-4{ :src => "test-small.jpg" } + .span-10.last + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2 + %img.push-5{ :src => "test-small.jpg" } + .span-10.last + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-12.last + %h5 + TESTING .PULL-1 TO .PULL-5 + .span-10 + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2.last + %img.top.pull-1{ :src => "test-small.jpg" } + .span-10 + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2.last + %img.top.pull-2{ :src => "test-small.jpg" } + .span-10 + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2.last + %img.top.pull-3{ :src => "test-small.jpg" } + .span-10 + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2.last + %img.top.pull-4{ :src => "test-small.jpg" } + .span-10 + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + .span-2.last + %img.top.pull-5{ :src => "test-small.jpg" } + .span-24 + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.bottom{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/test-small.jpg b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/test-small.jpg new file mode 100644 index 00000000..aa599d99 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/test-small.jpg differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/test.jpg b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/test.jpg new file mode 100644 index 00000000..0107be27 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/test.jpg differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/valid.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/valid.png new file mode 100644 index 00000000..dd20e497 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/parts/valid.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/ie.scss b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/ie.scss new file mode 100644 index 00000000..a5a0d158 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/ie.scss @@ -0,0 +1,3 @@ +@import "blueprint"; + +@include blueprint-ie; diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/images/grid.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/images/grid.png new file mode 100644 index 00000000..129d4a29 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/images/grid.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/print.scss b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/print.scss new file mode 100644 index 00000000..78a5b3db --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/print.scss @@ -0,0 +1,3 @@ +@import "blueprint"; + +@include blueprint-print; diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/screen.scss b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/screen.scss new file mode 100644 index 00000000..b7d6ded1 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_default/src/screen.scss @@ -0,0 +1,9 @@ +@import "blueprint"; +@import "blueprint/scaffolding"; +@import "compass/reset"; + +@include blueprint; + +// Remove the scaffolding when you're ready to start doing visual design. +// Or leave it in if you're happy with how blueprint looks out-of-the-box +@include blueprint-scaffolding; diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/config.rb b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/config.rb new file mode 100644 index 00000000..16f4235d --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/config.rb @@ -0,0 +1,8 @@ +# Require any additional compass plugins here. +project_type = :stand_alone +css_dir = "stylesheets" +sass_dir = "src" +images_dir = "images" +output_style = :compact +relative_assets = true + diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/cross.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/cross.png new file mode 100644 index 00000000..1514d51a Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/cross.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/key.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/key.png new file mode 100644 index 00000000..a9d5e4f8 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/key.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/tick.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/tick.png new file mode 100644 index 00000000..a9925a06 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/buttons/tick.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/grid.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/grid.png new file mode 100644 index 00000000..129d4a29 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/grid.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/doc.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/doc.png new file mode 100644 index 00000000..834cdfaf Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/doc.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/email.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/email.png new file mode 100644 index 00000000..7348aed7 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/email.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/external.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/external.png new file mode 100644 index 00000000..cf1cfb42 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/external.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/feed.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/feed.png new file mode 100644 index 00000000..315c4f4f Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/feed.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/im.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/im.png new file mode 100644 index 00000000..79f35ccb Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/im.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/pdf.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/pdf.png new file mode 100644 index 00000000..8f8095e4 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/pdf.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/visited.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/visited.png new file mode 100644 index 00000000..ebf206de Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/visited.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/xls.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/xls.png new file mode 100644 index 00000000..b977d7e5 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/link_icons/xls.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/test-small.jpg b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/test-small.jpg new file mode 100644 index 00000000..aa599d99 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/test-small.jpg differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/test.jpg b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/test.jpg new file mode 100644 index 00000000..0107be27 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/test.jpg differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/valid.png b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/valid.png new file mode 100644 index 00000000..dd20e497 Binary files /dev/null and b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/images/valid.png differ diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/index.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/index.html.haml new file mode 100644 index 00000000..004dbc09 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/index.html.haml @@ -0,0 +1,96 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint test pages + / + Framework CSS + %link{ :href => "stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "0", :border => "0", :cellpadding => "0" } + %tr + %th.span-6 + Test page + %th.span-8 + Main files tested + %th.span-10 + Description + %tr + %td + %a{ :href => "plugins/fancy_type.html" } + Fancy Type + %td + %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/_grid.sass" } + grid.sass + , + %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/_typography.sass" } + typography.sass + , + %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/_fancy_type.sass" } + fancy_type.sass + %td + A simple sample page, with common elements and fancy type. + %tr + %td + %a{ :href => "plugins/buttons.html" } + Buttons + %td + %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/_buttons.sass" } + buttons.sass + %td + A simple page, showing links and buttons styled using the button plugin. + %tr + %td + %a{ :href => "plugins/link_icons.html" } + Link Icons + %td + %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/_link_icons.sass" } + link_icons.sass + %td + A simple page, showing links icons. + %tr + %td + %a{ :href => "plugins/rtl.html" } + RTL + %td + %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/_rtl.sass" } + rtl.sass + %td + A simple page, showing a right-to-left grid layout. + %p + %em + %strong + Note about the css files: + These test files utilize the css files that are generated from + %a{ :href => "http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html" } + Sass templates + \. + In other words, if you change any of the source files, + you'll have to re-build them with + %code + rake examples + to see any changes. + .box + %p + For more information and help, try these resources: + %ul.bottom + %li + %a{ :href => "http://www.blueprintcss.org/" } + The Blueprint home page. + %li + %a{ :href => "http://groups.google.com/group/blueprintcss" } + Our anything-goes mailing list. + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "images/valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/buttons.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/buttons.html.haml new file mode 100644 index 00000000..331d378d --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/buttons.html.haml @@ -0,0 +1,67 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint Buttons Sample Page + / + Framework CSS + %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "../stylesheets/buttons.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %body + .container + %h1 + A Button Example Page + %hr + %h2.alt + This sample page demonstrates what you can do with the Buttons plugin. + %hr + .span-12 + %h3 + Link Buttons + %a.button + Link Button + %a.button.positive + Positive Button + %a.button.negative + Negative Button + .span-12.last + %h3 + Real Buttons + %button + Normal Button + %button.positive + Positive Button + %button.negative + Negative Button + .span-12 + %h3 + Link Buttons with Images + %a.button + %img{ :src => "../images/buttons/tick.png", :alt => "" } + Save + %a.button.positive + %img{ :src => "../images/buttons/key.png", :alt => "" } + Change Password + %a.button.negative + %img{ :src => "../images/buttons/cross.png", :alt => "" } + Cancel + .span-12.last + %h3 + Real Buttons with Images + %button + %img{ :src => "../images/buttons/tick.png", :alt => "" } + Save + %button.positive + %img{ :src => "../images/buttons/key.png", :alt => "" } + Change Password + %button.negative + %img{ :src => "../images/buttons/cross.png", :alt => "" } + Cancel + .span-24 + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/fancy_type.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/fancy_type.html.haml new file mode 100644 index 00000000..b17c1c28 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/fancy_type.html.haml @@ -0,0 +1,100 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint Sample Page + / + Framework CSS + %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "../images/test.jpg", :alt => "test" } + Lorem ipsum dolor sit amet, + %em + consectetuer adipiscing elit + \. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus. + %p + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + %a{ :href => "#" } + Morbi et risus + \. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent + %span.caps + SMALL CAPS + tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue. + %p + Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora. + %p + Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem. + %blockquote + %p + Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla. + %p + Maecenas vel metus quis magna pharetra fermentum. + %em + Integer sit amet tortor + \. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem. + %hr + .span-7.colborder + %h6 + This is a nested column + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + .span-7.last + %h6 + This is another nested column + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + .span-7.last + %h3 + A + %span.alt + Simple + Sidebar + %p + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. + %p + Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. + %p.quiet + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. + %h5 + Incremental leading + %p.incr + Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus. + %p.incr + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. + %hr + %h2.alt + You may pick and choose amongst these and many more features, so be bold. + %hr + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/link_icons.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/link_icons.html.haml new file mode 100644 index 00000000..13e93f2f --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/link_icons.html.haml @@ -0,0 +1,61 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint Link Icons Sample Page + / + Framework CSS + %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "../stylesheets/link_icons.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %body + .container + %h1 + A Link Icons Example Page + %hr + %h2.alt + This sample page demonstrates what you can do with the Link Icons plugin. + %hr + .span-12 + %h3 + External Links + %a{ :href => "http://www.no-such-website.com/" } + A Normal External Link + %a{ :href => "http://www.google.com" } + A Visited External Link + %a{ :href => "mailto:donald@duck.com" } + An Email Link + .span-12.last + %h3 + Document Links + %a{ :href => "http://www.no-such-website.com/sample.pdf" } + A .pdf Link + %a{ :href => "http://www.no-such-website.com/sample.doc" } + A .doc Link + %a{ :href => "http://www.no-such-website.com/sample.xls" } + A .xls Link + .span-12 + %h3 + Misc Links + %a{ :href => "http://www.no-such-website.com/sample.rss" } + An RSS Link + %a{ :href => "http://www.no-such-website.com/sample.rdf" } + An Atom Link + %a{ :href => "aim:chatmeup" } + A Instant Messenger Link + .span-12.last + %h3 + Turning Icons Off + %a.noicon{ :href => "http://www.no-such-website.com/" } + A Normal External Link + %a.noicon{ :href => "http://www.google.com" } + A Visited External Link + %a.noicon{ :href => "mailto:donald@duck.com" } + An Email Link + .span-24 + %p + %a.noicon{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/rtl.html.haml b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/rtl.html.haml new file mode 100644 index 00000000..58758202 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/plugins/rtl.html.haml @@ -0,0 +1,100 @@ +!!! +%html{ :lang => "en" } + %head + %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + Blueprint Sample Page + / + Framework CSS + %link{ :href => "../stylesheets/rtl_screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" } + %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" } + / + [if IE]> "../images/test.jpg", :alt => "test" } + Lorem ipsum dolor sit amet, + %em + consectetuer adipiscing elit + \. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus. + %p + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + %a{ :href => "#" } + Morbi et risus + \. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent + %span.caps + SMALL CAPS + tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue. + %p + Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora. + %p + Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem. + %blockquote + %p + Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla. + %p + Maecenas vel metus quis magna pharetra fermentum. + %em + Integer sit amet tortor + \. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem. + %hr + .span-7.colborder + %h6 + This is a nested column + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + .span-7.last + %h6 + This is another nested column + %p + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + .span-7.last + %h3 + A + %span.alt + Simple + Sidebar + %p + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. + %p + Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. + %p.quiet + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. + %h5 + Incremental leading + %p.incr + Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus. + %p.incr + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. + %hr + %h2.alt + You may pick and choose amongst these and many more features, so be bold. + %hr + %p + %a{ :href => "http://validator.w3.org/check?uri=referer" } + %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" } diff --git a/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/src/buttons.scss b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/src/buttons.scss new file mode 100644 index 00000000..0ca550e0 --- /dev/null +++ b/lib/ruby/gem/gems/compass-0.10.6/examples/blueprint_plugins/src/buttons.scss @@ -0,0 +1,47 @@ +@import "compass/utilities/general/float"; +@import "blueprint/buttons"; + +// Use the following HTML code to place the buttons on your site: +// +// +// +// +// Change Password +// +// +// +// Cancel +// + +a.button { + // you can pass "left" or "right" to +anchor-button to float it in that direction + // or you can pass no argument to leave it inline-block (cross browser safe!) within + // the flow of your page. + @include anchor-button(left); + // All the button color mixins take 4 optional arguments: + // font color, background color, border color, border highlight color + // the first three default to constants set in blueprint/buttons + // the last one defaults to a shade lighter than the border color. + @include button-colors; + @include button-hover-colors; + @include button-active-colors; } + +button { + // The +button-button mixin is just like the +anchor-button mixin, but for + + + Change Password + + + + Cancel + + +a.button + // you can pass "left" or "right" to +anchor-button to float it in that direction + // or you can pass no argument to leave it inline-block (cross browser safe!) within + // the flow of your page. + +anchor-button(left) + // All the button color mixins take 4 optional arguments: + // font color, background color, border color, border highlight color + // the first three default to constants set in blueprint/buttons.sass + // the last one defaults to a shade lighter than the border color. + +button-colors + +button-hover-colors + +button-active-colors + +button + // The +button-button mixin is just like the +anchor-button mixin, but for