From 8917f1a91a08ea9c05630519f721cec39ba8df9a Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 12 Jul 2015 20:28:42 +0200 Subject: [PATCH 001/227] MemoryBlob class: wrapper around the content of a file Makes it possible to detect the language of a snippet of code without having an actual file on disk Will allow github-markup to use Linguist without restricting its API --- lib/linguist/memory_blob.rb | 73 +++++++++ test/helper.rb | 21 ++- test/test_memory_blob.rb | 290 ++++++++++++++++++++++++++++++++++++ 3 files changed, 380 insertions(+), 4 deletions(-) create mode 100644 lib/linguist/memory_blob.rb create mode 100644 test/test_memory_blob.rb diff --git a/lib/linguist/memory_blob.rb b/lib/linguist/memory_blob.rb new file mode 100644 index 00000000..c17cf3e2 --- /dev/null +++ b/lib/linguist/memory_blob.rb @@ -0,0 +1,73 @@ +require 'linguist/blob_helper' + +module Linguist + # A MemoryBlob is a wrapper around the content of a file to make it quack + # like a Grit::Blob. It provides the basic interface: `name`, + # `data`, `path` and `size`. + class MemoryBlob + include BlobHelper + + # Public: Initialize a new MemoryBlob. + # + # path - A path String (does not necessarily exists on the file system). + # content - Content of the file. + # + # Returns a FileBlob. + def initialize(path, content) + @path = path + @content = content + end + + # Public: Filename + # + # Examples + # + # MemoryBlob.new("/path/to/linguist/lib/linguist.rb", "").path + # # => "/path/to/linguist/lib/linguist.rb" + # + # Returns a String + attr_reader :path + + # Public: File name + # + # Returns a String + def name + File.basename(@path) + end + + # Public: File contents. + # + # Returns a String. + def data + @content + end + + # Public: Get byte size + # + # Returns an Integer. + def size + @content.bytesize + end + + # Public: Get file extension. + # + # Returns a String. + def extension + extensions.last || "" + end + + # Public: Return an array of the file extensions + # + # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions + # => [".html.erb", ".erb"] + # + # Returns an Array + def extensions + basename, *segments = name.downcase.split(".") + + segments.map.with_index do |segment, index| + "." + segments[index..-1].join(".") + end + end + end +end diff --git a/test/helper.rb b/test/helper.rb index ab3cc8fa..71594416 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -3,14 +3,21 @@ require "minitest/autorun" require "mocha/setup" require "linguist" require 'color-proximity' +require "linguist/memory_blob" def fixtures_path File.expand_path("../fixtures", __FILE__) end def fixture_blob(name) - name = File.join(fixtures_path, name) unless name =~ /^\// - Linguist::FileBlob.new(name, fixtures_path) + filepath = (name =~ /^\//)? name : File.join(fixtures_path, name) + Linguist::FileBlob.new(filepath, fixtures_path) +end + +def fixture_blob_memory(name) + filepath = (name =~ /^\//)? name : File.join(fixtures_path, name) + content = File.read(filepath) + Linguist::MemoryBlob.new(name, content) end def samples_path @@ -18,6 +25,12 @@ def samples_path end def sample_blob(name) - name = File.join(samples_path, name) unless name =~ /^\// - Linguist::FileBlob.new(name, samples_path) + filepath = (name =~ /^\//)? name : File.join(samples_path, name) + Linguist::FileBlob.new(filepath, samples_path) +end + +def sample_blob_memory(name) + filepath = (name =~ /^\//)? name : File.join(samples_path, name) + content = File.read(filepath) + Linguist::MemoryBlob.new(name, content) end diff --git a/test/test_memory_blob.rb b/test/test_memory_blob.rb new file mode 100644 index 00000000..1ba856de --- /dev/null +++ b/test/test_memory_blob.rb @@ -0,0 +1,290 @@ +require_relative "./helper" + +class TestBlob < Minitest::Test + include Linguist + + def setup + # git blobs are normally loaded as ASCII-8BIT since they may contain data + # with arbitrary encoding not known ahead of time + @original_external = Encoding.default_external + Encoding.default_external = Encoding.find("ASCII-8BIT") + end + + def teardown + Encoding.default_external = @original_external + end + + def script_blob(name) + blob = sample_blob_memory(name) + blob.instance_variable_set(:@name, 'script') + blob + end + + def test_name + assert_equal "foo.rb", sample_blob_memory("Ruby/foo.rb").name + end + + def test_mime_type + assert_equal "application/postscript", fixture_blob_memory("Binary/octocat.ai").mime_type + assert_equal "application/x-ruby", sample_blob_memory("Ruby/grit.rb").mime_type + assert_equal "application/x-sh", sample_blob_memory("Shell/script.sh").mime_type + assert_equal "text/plain", fixture_blob_memory("Data/README").mime_type + end + + def test_content_type + assert_equal "application/pdf", fixture_blob_memory("Binary/foo.pdf").content_type + assert_equal "image/png", fixture_blob_memory("Binary/foo.png").content_type + assert_equal "text/plain; charset=iso-8859-2", fixture_blob_memory("Data/README").content_type + end + + def test_disposition + assert_equal "attachment; filename=foo+bar.jar", fixture_blob_memory("Binary/foo bar.jar").disposition + assert_equal "attachment; filename=foo.bin", fixture_blob_memory("Binary/foo.bin").disposition + assert_equal "attachment; filename=linguist.gem", fixture_blob_memory("Binary/linguist.gem").disposition + assert_equal "attachment; filename=octocat.ai", fixture_blob_memory("Binary/octocat.ai").disposition + assert_equal "inline", fixture_blob_memory("Data/README").disposition + assert_equal "inline", sample_blob_memory("Text/foo.txt").disposition + assert_equal "inline", sample_blob_memory("Ruby/grit.rb").disposition + assert_equal "inline", fixture_blob_memory("Binary/octocat.png").disposition + end + + def test_data + assert_equal "module Foo\nend\n", sample_blob_memory("Ruby/foo.rb").data + end + + def test_lines + assert_equal ["module Foo", "end", ""], sample_blob_memory("Ruby/foo.rb").lines + assert_equal ["line 1", "line 2", ""], sample_blob_memory("Text/mac.txt").lines + assert_equal 475, sample_blob_memory("Emacs Lisp/ess-julia.el").lines.length + end + + def test_lines_maintains_original_encoding + # Even if the file's encoding is detected as something like UTF-16LE, + # earlier versions of the gem made implicit guarantees that the encoding of + # each `line` is in the same encoding as the file was originally read (in + # practice, UTF-8 or ASCII-8BIT) + assert_equal Encoding.default_external, fixture_blob_memory("Data/utf16le").lines.first.encoding + end + + def test_size + assert_equal 15, sample_blob_memory("Ruby/foo.rb").size + end + + def test_loc + assert_equal 3, sample_blob_memory("Ruby/foo.rb").loc + end + + def test_sloc + assert_equal 2, sample_blob_memory("Ruby/foo.rb").sloc + assert_equal 3, fixture_blob_memory("Data/utf16le-windows").sloc + assert_equal 1, fixture_blob_memory("Data/iso8859-8-i").sloc + end + + def test_encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").ruby_encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").ruby_encoding + assert_equal "ISO-2022-KR", sample_blob_memory("Text/ISO-2022-KR.txt").encoding + assert_equal "binary", sample_blob_memory("Text/ISO-2022-KR.txt").ruby_encoding + assert_nil fixture_blob_memory("Binary/dog.o").encoding + end + + def test_binary + assert fixture_blob_memory("Binary/git.deb").binary? + assert fixture_blob_memory("Binary/hello.pbc").binary? + assert fixture_blob_memory("Binary/linguist.gem").binary? + assert fixture_blob_memory("Binary/octocat.ai").binary? + assert fixture_blob_memory("Binary/octocat.png").binary? + assert fixture_blob_memory("Binary/zip").binary? + assert !fixture_blob_memory("Data/README").binary? + assert !sample_blob_memory("Ruby/foo.rb").binary? + assert !sample_blob_memory("Perl/script.pl").binary? + end + + def test_all_binary + Samples.each do |sample| + blob = sample_blob_memory(sample[:path]) + assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" + end + end + + def test_text + assert fixture_blob_memory("Data/README").text? + assert fixture_blob_memory("Data/md").text? + assert sample_blob_memory("Shell/script.sh").text? + assert fixture_blob_memory("Data/txt").text? + end + + def test_image + assert fixture_blob_memory("Binary/octocat.png").image? + assert !fixture_blob_memory("Binary/octocat.ai").image? + assert !fixture_blob_memory("Binary/octocat.psd").image? + end + + def test_solid + assert fixture_blob_memory("Binary/cube.stl").solid? + assert fixture_blob_memory("Data/cube.stl").solid? + end + + def test_csv + assert fixture_blob_memory("Data/cars.csv").csv? + end + + def test_pdf + assert fixture_blob_memory("Binary/foo.pdf").pdf? + end + + def test_viewable + assert fixture_blob_memory("Data/README").viewable? + assert sample_blob_memory("Ruby/foo.rb").viewable? + assert sample_blob_memory("Perl/script.pl").viewable? + assert !fixture_blob_memory("Binary/linguist.gem").viewable? + assert !fixture_blob_memory("Binary/octocat.ai").viewable? + assert !fixture_blob_memory("Binary/octocat.png").viewable? + end + + def test_generated + assert !fixture_blob_memory("Data/README").generated? + + # Generated .NET Docfiles + assert sample_blob_memory("XML/net_docfile.xml").generated? + + # Long line + assert !sample_blob_memory("JavaScript/uglify.js").generated? + + # Inlined JS, but mostly code + assert !sample_blob_memory("JavaScript/json2_backbone.js").generated? + + # Minified JS + assert !sample_blob_memory("JavaScript/jquery-1.6.1.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.6.1.min.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.4.2.min.js").generated? + + # Composer generated composer.lock file + assert sample_blob_memory("JSON/composer.lock").generated? + + # PEG.js-generated parsers + assert sample_blob_memory("JavaScript/parser.js").generated? + + # Generated PostScript + assert !sample_blob_memory("PostScript/sierpinski.ps").generated? + + # These examples are too basic to tell + assert !sample_blob_memory("JavaScript/hello.js").generated? + + assert sample_blob_memory("JavaScript/intro-old.js").generated? + assert sample_blob_memory("JavaScript/classes-old.js").generated? + + assert sample_blob_memory("JavaScript/intro.js").generated? + assert sample_blob_memory("JavaScript/classes.js").generated? + + # Protocol Buffer generated code + assert sample_blob_memory("C++/protocol-buffer.pb.h").generated? + assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated? + assert sample_blob_memory("Java/ProtocolBuffer.java").generated? + assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated? + assert sample_blob_memory("Go/api.pb.go").generated? + assert sample_blob_memory("Go/embedded.go").generated? + + # Apache Thrift generated code + assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated? + assert sample_blob_memory("Go/gen-go-linguist-thrift.go").generated? + assert sample_blob_memory("Java/gen-java-linguist-thrift.java").generated? + assert sample_blob_memory("JavaScript/gen-js-linguist-thrift.js").generated? + assert sample_blob_memory("Ruby/gen-rb-linguist-thrift.rb").generated? + assert sample_blob_memory("Objective-C/gen-cocoa-linguist-thrift.m").generated? + + # Generated JNI + assert sample_blob_memory("C/jni_layer.h").generated? + + # Minified CSS + assert !sample_blob_memory("CSS/bootstrap.css").generated? + assert sample_blob_memory("CSS/bootstrap.min.css").generated? + + # Generated VCR + assert sample_blob_memory("YAML/vcr_cassette.yml").generated? + + # Generated by Zephir + assert !sample_blob_memory("Zephir/Router.zep").generated? + + # Cython-generated C/C++ + assert sample_blob_memory("C/sgd_fast.c").generated? + assert sample_blob_memory("C++/wrapper_inner.cpp").generated? + + # Unity3D-generated metadata + assert sample_blob_memory("Unity3D Asset/Tiles.meta").generated? + end + + def test_vendored + assert !fixture_blob_memory("Data/README").vendored? + end + + def test_language + Samples.each do |sample| + blob = sample_blob_memory(sample[:path]) + assert blob.language, "No language for #{sample[:path]}" + assert_equal sample[:language], blob.language.name, blob.name + end + + # Test language detection for files which shouldn't be used as samples + root = File.expand_path('../fixtures', __FILE__) + Dir.entries(root).each do |language| + next if language == '.' || language == '..' || language == 'Binary' || + File.basename(language) == 'ace_modes.json' + + # Each directory contains test files of a language + dirname = File.join(root, language) + Dir.entries(dirname).each do |filename| + # By default blob search the file in the samples; + # thus, we need to give it the absolute path + filepath = File.join(dirname, filename) + next unless File.file?(filepath) + + blob = fixture_blob_memory(filepath) + if language == 'Data' + assert blob.language.nil?, "A language was found for #{filepath}" + elsif language == 'Generated' + assert blob.generated?, "#{filepath} is not a generated file" + else + assert blob.language, "No language for #{filepath}" + assert_equal language, blob.language.name, blob.name + end + end + end + end + + def test_minified_files_not_safe_to_highlight + assert !sample_blob_memory("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? + end + + def test_empty + blob = Struct.new(:data) { include Linguist::BlobHelper } + + assert blob.new("").empty? + assert blob.new(nil).empty? + refute blob.new(" ").empty? + refute blob.new("nope").empty? + end + + def test_include_in_language_stats + generated = sample_blob_memory("CSS/bootstrap.min.css") + assert_predicate generated, :generated? + refute_predicate generated, :include_in_language_stats? + + data = sample_blob_memory("Ant Build System/filenames/ant.xml") + assert_equal :data, data.language.type + refute_predicate data, :include_in_language_stats? + + prose = sample_blob_memory("Markdown/tender.md") + assert_equal :prose, prose.language.type + refute_predicate prose, :include_in_language_stats? + + included = sample_blob_memory("HTML/pages.html") + assert_predicate included, :include_in_language_stats? + end +end From 5a646384f6649474eb539d6c4c7734a244a98ec8 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 12 Jul 2015 20:56:51 +0200 Subject: [PATCH 002/227] FileBlob extends MemoryBlob --- lib/linguist/file_blob.rb | 45 ++------------------------------------- 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb index 20d87bb0..98ef3825 100644 --- a/lib/linguist/file_blob.rb +++ b/lib/linguist/file_blob.rb @@ -1,10 +1,11 @@ require 'linguist/blob_helper' +require 'linguist/memory_blob' module Linguist # A FileBlob is a wrapper around a File object to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. - class FileBlob + class FileBlob < MemoryBlob include BlobHelper # Public: Initialize a new FileBlob from a path @@ -18,20 +19,6 @@ module Linguist @path = base_path ? path.sub("#{base_path}/", '') : path end - # Public: Filename - # - # Examples - # - # FileBlob.new("/path/to/linguist/lib/linguist.rb").path - # # => "/path/to/linguist/lib/linguist.rb" - # - # FileBlob.new("/path/to/linguist/lib/linguist.rb", - # "/path/to/linguist").path - # # => "lib/linguist.rb" - # - # Returns a String - attr_reader :path - # Public: Read file permissions # # Returns a String like '100644' @@ -39,13 +26,6 @@ module Linguist File.stat(@fullpath).mode.to_s(8) end - # Public: File name - # - # Returns a String - def name - File.basename(@fullpath) - end - # Public: Read file contents. # # Returns a String. @@ -59,26 +39,5 @@ module Linguist def size File.size(@fullpath) end - - # Public: Get file extension. - # - # Returns a String. - def extension - extensions.last || "" - end - - # Public: Return an array of the file extensions - # - # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions - # => [".html.erb", ".erb"] - # - # Returns an Array - def extensions - basename, *segments = name.downcase.split(".") - - segments.map.with_index do |segment, index| - "." + segments[index..-1].join(".") - end - end end end From eca10056a87b6d82d1292aee746d3dfdee0c5b23 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 17:29:35 +0200 Subject: [PATCH 003/227] Rename MemoryBlob to Blob --- lib/linguist/{memory_blob.rb => blob.rb} | 2 +- lib/linguist/file_blob.rb | 4 ++-- test/helper.rb | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename lib/linguist/{memory_blob.rb => blob.rb} (98%) diff --git a/lib/linguist/memory_blob.rb b/lib/linguist/blob.rb similarity index 98% rename from lib/linguist/memory_blob.rb rename to lib/linguist/blob.rb index c17cf3e2..8131d9b8 100644 --- a/lib/linguist/memory_blob.rb +++ b/lib/linguist/blob.rb @@ -4,7 +4,7 @@ module Linguist # A MemoryBlob is a wrapper around the content of a file to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. - class MemoryBlob + class Blob include BlobHelper # Public: Initialize a new MemoryBlob. diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb index 98ef3825..5f8bc373 100644 --- a/lib/linguist/file_blob.rb +++ b/lib/linguist/file_blob.rb @@ -1,11 +1,11 @@ require 'linguist/blob_helper' -require 'linguist/memory_blob' +require 'linguist/blob' module Linguist # A FileBlob is a wrapper around a File object to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. - class FileBlob < MemoryBlob + class FileBlob < Blob include BlobHelper # Public: Initialize a new FileBlob from a path diff --git a/test/helper.rb b/test/helper.rb index 71594416..bac2a62c 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -3,7 +3,7 @@ require "minitest/autorun" require "mocha/setup" require "linguist" require 'color-proximity' -require "linguist/memory_blob" +require "linguist/blob" def fixtures_path File.expand_path("../fixtures", __FILE__) @@ -17,7 +17,7 @@ end def fixture_blob_memory(name) filepath = (name =~ /^\//)? name : File.join(fixtures_path, name) content = File.read(filepath) - Linguist::MemoryBlob.new(name, content) + Linguist::Blob.new(name, content) end def samples_path @@ -32,5 +32,5 @@ end def sample_blob_memory(name) filepath = (name =~ /^\//)? name : File.join(samples_path, name) content = File.read(filepath) - Linguist::MemoryBlob.new(name, content) + Linguist::Blob.new(name, content) end From 2c2b37bec3a78e30ee090894047b9d6f1302d57c Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 18:07:42 +0200 Subject: [PATCH 004/227] Reorganize tests Rename test_memory_blob.rb to test_blob.rb for consistence with last commit --- test/test_blob.rb | 565 +++++++--------------------------- test/test_file_blob.rb | 638 ++++++++++++++++++++++++++++++++++++++- test/test_memory_blob.rb | 290 ------------------ 3 files changed, 745 insertions(+), 748 deletions(-) delete mode 100644 test/test_memory_blob.rb diff --git a/test/test_blob.rb b/test/test_blob.rb index 0a1cefe9..1ba856de 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -15,50 +15,47 @@ class TestBlob < Minitest::Test end def script_blob(name) - blob = sample_blob(name) + blob = sample_blob_memory(name) blob.instance_variable_set(:@name, 'script') blob end def test_name - assert_equal "foo.rb", sample_blob("foo.rb").name + assert_equal "foo.rb", sample_blob_memory("Ruby/foo.rb").name end def test_mime_type - assert_equal "application/postscript", fixture_blob("Binary/octocat.ai").mime_type - assert_equal "application/x-ruby", sample_blob("Ruby/grit.rb").mime_type - assert_equal "application/x-sh", sample_blob("Shell/script.sh").mime_type - assert_equal "application/xml", sample_blob("XML/bar.xml").mime_type - assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").mime_type - assert_equal "text/plain", fixture_blob("Data/README").mime_type + assert_equal "application/postscript", fixture_blob_memory("Binary/octocat.ai").mime_type + assert_equal "application/x-ruby", sample_blob_memory("Ruby/grit.rb").mime_type + assert_equal "application/x-sh", sample_blob_memory("Shell/script.sh").mime_type + assert_equal "text/plain", fixture_blob_memory("Data/README").mime_type end def test_content_type - assert_equal "application/pdf", fixture_blob("Binary/foo.pdf").content_type - assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").content_type - assert_equal "image/png", fixture_blob("Binary/foo.png").content_type - assert_equal "text/plain; charset=iso-8859-2", fixture_blob("Data/README").content_type + assert_equal "application/pdf", fixture_blob_memory("Binary/foo.pdf").content_type + assert_equal "image/png", fixture_blob_memory("Binary/foo.png").content_type + assert_equal "text/plain; charset=iso-8859-2", fixture_blob_memory("Data/README").content_type end def test_disposition - assert_equal "attachment; filename=foo+bar.jar", fixture_blob("Binary/foo bar.jar").disposition - assert_equal "attachment; filename=foo.bin", fixture_blob("Binary/foo.bin").disposition - assert_equal "attachment; filename=linguist.gem", fixture_blob("Binary/linguist.gem").disposition - assert_equal "attachment; filename=octocat.ai", fixture_blob("Binary/octocat.ai").disposition - assert_equal "inline", fixture_blob("Data/README").disposition - assert_equal "inline", sample_blob("Text/foo.txt").disposition - assert_equal "inline", sample_blob("Ruby/grit.rb").disposition - assert_equal "inline", fixture_blob("Binary/octocat.png").disposition + assert_equal "attachment; filename=foo+bar.jar", fixture_blob_memory("Binary/foo bar.jar").disposition + assert_equal "attachment; filename=foo.bin", fixture_blob_memory("Binary/foo.bin").disposition + assert_equal "attachment; filename=linguist.gem", fixture_blob_memory("Binary/linguist.gem").disposition + assert_equal "attachment; filename=octocat.ai", fixture_blob_memory("Binary/octocat.ai").disposition + assert_equal "inline", fixture_blob_memory("Data/README").disposition + assert_equal "inline", sample_blob_memory("Text/foo.txt").disposition + assert_equal "inline", sample_blob_memory("Ruby/grit.rb").disposition + assert_equal "inline", fixture_blob_memory("Binary/octocat.png").disposition end def test_data - assert_equal "module Foo\nend\n", sample_blob("Ruby/foo.rb").data + assert_equal "module Foo\nend\n", sample_blob_memory("Ruby/foo.rb").data end def test_lines - assert_equal ["module Foo", "end", ""], sample_blob("Ruby/foo.rb").lines - assert_equal ["line 1", "line 2", ""], sample_blob("Text/mac.txt").lines - assert_equal 475, sample_blob("Emacs Lisp/ess-julia.el").lines.length + assert_equal ["module Foo", "end", ""], sample_blob_memory("Ruby/foo.rb").lines + assert_equal ["line 1", "line 2", ""], sample_blob_memory("Text/mac.txt").lines + assert_equal 475, sample_blob_memory("Emacs Lisp/ess-julia.el").lines.length end def test_lines_maintains_original_encoding @@ -66,508 +63,170 @@ class TestBlob < Minitest::Test # earlier versions of the gem made implicit guarantees that the encoding of # each `line` is in the same encoding as the file was originally read (in # practice, UTF-8 or ASCII-8BIT) - assert_equal Encoding.default_external, fixture_blob("Data/utf16le").lines.first.encoding + assert_equal Encoding.default_external, fixture_blob_memory("Data/utf16le").lines.first.encoding end def test_size - assert_equal 15, sample_blob("Ruby/foo.rb").size + assert_equal 15, sample_blob_memory("Ruby/foo.rb").size end def test_loc - assert_equal 3, sample_blob("Ruby/foo.rb").loc + assert_equal 3, sample_blob_memory("Ruby/foo.rb").loc end def test_sloc - assert_equal 2, sample_blob("Ruby/foo.rb").sloc - assert_equal 3, fixture_blob("Data/utf16le-windows").sloc - assert_equal 1, fixture_blob("Data/iso8859-8-i").sloc + assert_equal 2, sample_blob_memory("Ruby/foo.rb").sloc + assert_equal 3, fixture_blob_memory("Data/utf16le-windows").sloc + assert_equal 1, fixture_blob_memory("Data/iso8859-8-i").sloc end def test_encoding - assert_equal "ISO-8859-2", fixture_blob("Data/README").encoding - assert_equal "ISO-8859-2", fixture_blob("Data/README").ruby_encoding - assert_equal "UTF-8", sample_blob("Text/foo.txt").encoding - assert_equal "UTF-8", sample_blob("Text/foo.txt").ruby_encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le").encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le").ruby_encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").ruby_encoding - assert_equal "ISO-2022-KR", sample_blob("Text/ISO-2022-KR.txt").encoding - assert_equal "binary", sample_blob("Text/ISO-2022-KR.txt").ruby_encoding - assert_nil fixture_blob("Binary/dog.o").encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").ruby_encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").ruby_encoding + assert_equal "ISO-2022-KR", sample_blob_memory("Text/ISO-2022-KR.txt").encoding + assert_equal "binary", sample_blob_memory("Text/ISO-2022-KR.txt").ruby_encoding + assert_nil fixture_blob_memory("Binary/dog.o").encoding end def test_binary - # Large blobs aren't loaded - large_blob = sample_blob("git.exe") - large_blob.instance_eval do - def data; end - end - assert large_blob.binary? - - assert fixture_blob("Binary/git.deb").binary? - assert fixture_blob("Binary/git.exe").binary? - assert fixture_blob("Binary/hello.pbc").binary? - assert fixture_blob("Binary/linguist.gem").binary? - assert fixture_blob("Binary/octocat.ai").binary? - assert fixture_blob("Binary/octocat.png").binary? - assert fixture_blob("Binary/zip").binary? - assert !fixture_blob("Data/README").binary? - assert !sample_blob("Ruby/foo.rb").binary? - assert !sample_blob("Perl/script.pl").binary? + assert fixture_blob_memory("Binary/git.deb").binary? + assert fixture_blob_memory("Binary/hello.pbc").binary? + assert fixture_blob_memory("Binary/linguist.gem").binary? + assert fixture_blob_memory("Binary/octocat.ai").binary? + assert fixture_blob_memory("Binary/octocat.png").binary? + assert fixture_blob_memory("Binary/zip").binary? + assert !fixture_blob_memory("Data/README").binary? + assert !sample_blob_memory("Ruby/foo.rb").binary? + assert !sample_blob_memory("Perl/script.pl").binary? end def test_all_binary Samples.each do |sample| - blob = sample_blob(sample[:path]) + blob = sample_blob_memory(sample[:path]) assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" end end def test_text - assert fixture_blob("Data/README").text? - assert fixture_blob("Data/md").text? - assert sample_blob("Shell/script.sh").text? - assert fixture_blob("Data/txt").text? + assert fixture_blob_memory("Data/README").text? + assert fixture_blob_memory("Data/md").text? + assert sample_blob_memory("Shell/script.sh").text? + assert fixture_blob_memory("Data/txt").text? end def test_image - assert fixture_blob("Binary/octocat.gif").image? - assert fixture_blob("Binary/octocat.jpeg").image? - assert fixture_blob("Binary/octocat.jpg").image? - assert fixture_blob("Binary/octocat.png").image? - assert !fixture_blob("Binary/octocat.ai").image? - assert !fixture_blob("Binary/octocat.psd").image? + assert fixture_blob_memory("Binary/octocat.png").image? + assert !fixture_blob_memory("Binary/octocat.ai").image? + assert !fixture_blob_memory("Binary/octocat.psd").image? end def test_solid - assert fixture_blob("Binary/cube.stl").solid? - assert fixture_blob("Data/cube.stl").solid? + assert fixture_blob_memory("Binary/cube.stl").solid? + assert fixture_blob_memory("Data/cube.stl").solid? end def test_csv - assert fixture_blob("Data/cars.csv").csv? + assert fixture_blob_memory("Data/cars.csv").csv? end def test_pdf - assert fixture_blob("Binary/foo.pdf").pdf? + assert fixture_blob_memory("Binary/foo.pdf").pdf? end def test_viewable - assert fixture_blob("Data/README").viewable? - assert sample_blob("Ruby/foo.rb").viewable? - assert sample_blob("Perl/script.pl").viewable? - assert !fixture_blob("Binary/linguist.gem").viewable? - assert !fixture_blob("Binary/octocat.ai").viewable? - assert !fixture_blob("Binary/octocat.png").viewable? + assert fixture_blob_memory("Data/README").viewable? + assert sample_blob_memory("Ruby/foo.rb").viewable? + assert sample_blob_memory("Perl/script.pl").viewable? + assert !fixture_blob_memory("Binary/linguist.gem").viewable? + assert !fixture_blob_memory("Binary/octocat.ai").viewable? + assert !fixture_blob_memory("Binary/octocat.png").viewable? end def test_generated - assert !fixture_blob("Data/README").generated? - - # Xcode project files - assert !sample_blob("XML/MainMenu.xib").generated? - assert fixture_blob("Binary/MainMenu.nib").generated? - assert !sample_blob("XML/project.pbxproj").generated? - - # Gemfile.lock is NOT generated - assert !sample_blob("Gemfile.lock").generated? + assert !fixture_blob_memory("Data/README").generated? # Generated .NET Docfiles - assert sample_blob("XML/net_docfile.xml").generated? + assert sample_blob_memory("XML/net_docfile.xml").generated? # Long line - assert !sample_blob("JavaScript/uglify.js").generated? + assert !sample_blob_memory("JavaScript/uglify.js").generated? # Inlined JS, but mostly code - assert !sample_blob("JavaScript/json2_backbone.js").generated? + assert !sample_blob_memory("JavaScript/json2_backbone.js").generated? # Minified JS - assert !sample_blob("JavaScript/jquery-1.6.1.js").generated? - assert sample_blob("JavaScript/jquery-1.6.1.min.js").generated? - assert sample_blob("JavaScript/jquery-1.4.2.min.js").generated? - - # CoffeeScript-generated JS - # TODO - - # TypeScript-generated JS - # TODO + assert !sample_blob_memory("JavaScript/jquery-1.6.1.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.6.1.min.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.4.2.min.js").generated? # Composer generated composer.lock file - assert sample_blob("JSON/composer.lock").generated? + assert sample_blob_memory("JSON/composer.lock").generated? # PEG.js-generated parsers - assert sample_blob("JavaScript/parser.js").generated? + assert sample_blob_memory("JavaScript/parser.js").generated? # Generated PostScript - assert !sample_blob("PostScript/sierpinski.ps").generated? + assert !sample_blob_memory("PostScript/sierpinski.ps").generated? # These examples are too basic to tell - assert !sample_blob("JavaScript/hello.js").generated? + assert !sample_blob_memory("JavaScript/hello.js").generated? - assert sample_blob("JavaScript/intro-old.js").generated? - assert sample_blob("JavaScript/classes-old.js").generated? + assert sample_blob_memory("JavaScript/intro-old.js").generated? + assert sample_blob_memory("JavaScript/classes-old.js").generated? - assert sample_blob("JavaScript/intro.js").generated? - assert sample_blob("JavaScript/classes.js").generated? + assert sample_blob_memory("JavaScript/intro.js").generated? + assert sample_blob_memory("JavaScript/classes.js").generated? # Protocol Buffer generated code - assert sample_blob("C++/protocol-buffer.pb.h").generated? - assert sample_blob("C++/protocol-buffer.pb.cc").generated? - assert sample_blob("Java/ProtocolBuffer.java").generated? - assert sample_blob("Python/protocol_buffer_pb2.py").generated? - assert sample_blob("Go/api.pb.go").generated? - assert sample_blob("Go/embedded.go").generated? + assert sample_blob_memory("C++/protocol-buffer.pb.h").generated? + assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated? + assert sample_blob_memory("Java/ProtocolBuffer.java").generated? + assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated? + assert sample_blob_memory("Go/api.pb.go").generated? + assert sample_blob_memory("Go/embedded.go").generated? # Apache Thrift generated code - assert sample_blob("Python/gen-py-linguist-thrift.py").generated? - assert sample_blob("Go/gen-go-linguist-thrift.go").generated? - assert sample_blob("Java/gen-java-linguist-thrift.java").generated? - assert sample_blob("JavaScript/gen-js-linguist-thrift.js").generated? - assert sample_blob("Ruby/gen-rb-linguist-thrift.rb").generated? - assert sample_blob("Objective-C/gen-cocoa-linguist-thrift.m").generated? + assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated? + assert sample_blob_memory("Go/gen-go-linguist-thrift.go").generated? + assert sample_blob_memory("Java/gen-java-linguist-thrift.java").generated? + assert sample_blob_memory("JavaScript/gen-js-linguist-thrift.js").generated? + assert sample_blob_memory("Ruby/gen-rb-linguist-thrift.rb").generated? + assert sample_blob_memory("Objective-C/gen-cocoa-linguist-thrift.m").generated? # Generated JNI - assert sample_blob("C/jni_layer.h").generated? + assert sample_blob_memory("C/jni_layer.h").generated? # Minified CSS - assert !sample_blob("CSS/bootstrap.css").generated? - assert sample_blob("CSS/bootstrap.min.css").generated? + assert !sample_blob_memory("CSS/bootstrap.css").generated? + assert sample_blob_memory("CSS/bootstrap.min.css").generated? # Generated VCR - assert sample_blob("YAML/vcr_cassette.yml").generated? + assert sample_blob_memory("YAML/vcr_cassette.yml").generated? # Generated by Zephir - assert sample_blob("Zephir/filenames/exception.zep.c").generated? - assert sample_blob("Zephir/filenames/exception.zep.h").generated? - assert sample_blob("Zephir/filenames/exception.zep.php").generated? - assert !sample_blob("Zephir/Router.zep").generated? - - assert sample_blob("node_modules/grunt/lib/grunt.js").generated? - - # Godep saved dependencies - assert sample_blob("Godeps/Godeps.json").generated? - assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated? + assert !sample_blob_memory("Zephir/Router.zep").generated? # Cython-generated C/C++ - assert sample_blob("C/sgd_fast.c").generated? - assert sample_blob("C++/wrapper_inner.cpp").generated? + assert sample_blob_memory("C/sgd_fast.c").generated? + assert sample_blob_memory("C++/wrapper_inner.cpp").generated? # Unity3D-generated metadata - assert sample_blob("Unity3D Asset/Tiles.meta").generated? + assert sample_blob_memory("Unity3D Asset/Tiles.meta").generated? end def test_vendored - assert !fixture_blob("Data/README").vendored? - assert !sample_blob("ext/extconf.rb").vendored? - - # Dependencies - assert sample_blob("dependencies/windows/headers/GL/glext.h").vendored? - - # Node dependencies - assert sample_blob("node_modules/coffee-script/lib/coffee-script.js").vendored? - - # Bower Components - assert sample_blob("bower_components/custom/custom.js").vendored? - assert sample_blob("app/bower_components/custom/custom.js").vendored? - assert sample_blob("vendor/assets/bower_components/custom/custom.js").vendored? - - # Go dependencies - assert !sample_blob("Godeps/Godeps.json").vendored? - assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored? - - # Rails vendor/ - assert sample_blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored? - - # Vendor/ - assert sample_blob("Vendor/my_great_file.h").vendored? - - # 'thirdparty' directory - assert sample_blob("thirdparty/lib/main.c").vendored? - - # 'extern(al)' directory - assert sample_blob("extern/util/__init__.py").vendored? - assert sample_blob("external/jquery.min.js").vendored? - - # C deps - assert sample_blob("deps/http_parser/http_parser.c").vendored? - assert sample_blob("deps/v8/src/v8.h").vendored? - - assert sample_blob("tools/something/else.c").vendored? - - # Chart.js - assert sample_blob("some/vendored/path/Chart.js").vendored? - assert !sample_blob("some/vendored/path/chart.js").vendored? - - # Codemirror deps - assert sample_blob("codemirror/mode/blah.js").vendored? - - # Debian packaging - assert sample_blob("debian/cron.d").vendored? - - # Erlang - assert sample_blob("rebar").vendored? - - # git config files - - assert_predicate fixture_blob("some/path/.gitattributes"), :vendored? - assert_predicate fixture_blob(".gitignore"), :vendored? - assert_predicate fixture_blob("special/path/.gitmodules"), :vendored? - - # Minified JavaScript and CSS - assert sample_blob("foo.min.js").vendored? - assert sample_blob("foo.min.css").vendored? - assert sample_blob("foo-min.js").vendored? - assert sample_blob("foo-min.css").vendored? - assert !sample_blob("foomin.css").vendored? - assert !sample_blob("foo.min.txt").vendored? - - #.osx - assert sample_blob(".osx").vendored? - - # Prototype - assert !sample_blob("public/javascripts/application.js").vendored? - assert sample_blob("public/javascripts/prototype.js").vendored? - assert sample_blob("public/javascripts/effects.js").vendored? - assert sample_blob("public/javascripts/controls.js").vendored? - assert sample_blob("public/javascripts/dragdrop.js").vendored? - - # jQuery - assert sample_blob("jquery.js").vendored? - assert sample_blob("public/javascripts/jquery.js").vendored? - assert sample_blob("public/javascripts/jquery.min.js").vendored? - assert sample_blob("public/javascripts/jquery-1.7.js").vendored? - assert sample_blob("public/javascripts/jquery-1.7.min.js").vendored? - assert sample_blob("public/javascripts/jquery-1.5.2.js").vendored? - assert sample_blob("public/javascripts/jquery-1.6.1.js").vendored? - assert sample_blob("public/javascripts/jquery-1.6.1.min.js").vendored? - assert sample_blob("public/javascripts/jquery-1.10.1.js").vendored? - assert sample_blob("public/javascripts/jquery-1.10.1.min.js").vendored? - assert !sample_blob("public/javascripts/jquery.github.menu.js").vendored? - - # jQuery UI - assert sample_blob("themes/ui-lightness/jquery-ui.css").vendored? - assert sample_blob("themes/ui-lightness/jquery-ui-1.8.22.custom.css").vendored? - assert sample_blob("themes/ui-lightness/jquery.ui.accordion.css").vendored? - assert sample_blob("ui/i18n/jquery.ui.datepicker-ar.js").vendored? - assert sample_blob("ui/i18n/jquery-ui-i18n.js").vendored? - assert sample_blob("ui/jquery.effects.blind.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.22.custom.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.22.custom.min.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.22.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.js").vendored? - assert sample_blob("ui/jquery-ui.min.js").vendored? - assert sample_blob("ui/jquery.ui.accordion.js").vendored? - assert sample_blob("ui/minified/jquery.effects.blind.min.js").vendored? - assert sample_blob("ui/minified/jquery.ui.accordion.min.js").vendored? - - # MooTools - assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored? - assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored? - - # Dojo - assert sample_blob("public/javascripts/dojo.js").vendored? - - # MochiKit - assert sample_blob("public/javascripts/MochiKit.js").vendored? - - # YUI - assert sample_blob("public/javascripts/yahoo-dom-event.js").vendored? - assert sample_blob("public/javascripts/yahoo-min.js").vendored? - assert sample_blob("public/javascripts/yuiloader-dom-event.js").vendored? - - # WYS editors - assert sample_blob("public/javascripts/ckeditor.js").vendored? - assert sample_blob("public/javascripts/tiny_mce.js").vendored? - assert sample_blob("public/javascripts/tiny_mce_popup.js").vendored? - assert sample_blob("public/javascripts/tiny_mce_src.js").vendored? - - # AngularJS - assert sample_blob("public/javascripts/angular.js").vendored? - assert sample_blob("public/javascripts/angular.min.js").vendored? - - # D3.js - assert sample_blob("public/javascripts/d3.v3.js").vendored? - assert sample_blob("public/javascripts/d3.v3.min.js").vendored? - - # Modernizr - assert sample_blob("public/javascripts/modernizr-2.7.1.js").vendored? - assert sample_blob("public/javascripts/modernizr.custom.01009.js").vendored? - - # Fabric - assert sample_blob("fabfile.py").vendored? - - # WAF - assert sample_blob("waf").vendored? - - # Visual Studio IntelliSense - assert sample_blob("Scripts/jquery-1.7-vsdoc.js").vendored? - - # Microsoft Ajax - assert sample_blob("Scripts/MicrosoftAjax.debug.js").vendored? - assert sample_blob("Scripts/MicrosoftAjax.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcAjax.debug.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcAjax.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcValidation.debug.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcValidation.js").vendored? - - # jQuery validation plugin (MS bundles this with asp.net mvc) - assert sample_blob("Scripts/jquery.validate.js").vendored? - assert sample_blob("Scripts/jquery.validate.min.js").vendored? - assert sample_blob("Scripts/jquery.validate.unobtrusive.js").vendored? - assert sample_blob("Scripts/jquery.validate.unobtrusive.min.js").vendored? - assert sample_blob("Scripts/jquery.unobtrusive-ajax.js").vendored? - assert sample_blob("Scripts/jquery.unobtrusive-ajax.min.js").vendored? - - # NuGet Packages - assert sample_blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? - - # Font Awesome - assert sample_blob("some/asset/path/font-awesome.min.css").vendored? - assert sample_blob("some/asset/path/font-awesome.css").vendored? - - # Normalize - assert sample_blob("some/asset/path/normalize.css").vendored? - - # Carthage - assert sample_blob('Carthage/blah').vendored? - - # Cocoapods - assert sample_blob('Pods/blah').vendored? - - # Html5shiv - assert sample_blob("Scripts/html5shiv.js").vendored? - assert sample_blob("Scripts/html5shiv.min.js").vendored? - - # Test fixtures - assert sample_blob("test/fixtures/random.rkt").vendored? - assert sample_blob("Test/fixtures/random.rkt").vendored? - assert sample_blob("tests/fixtures/random.rkt").vendored? - - # Cordova/PhoneGap - assert sample_blob("cordova.js").vendored? - assert sample_blob("cordova.min.js").vendored? - assert sample_blob("cordova-2.1.0.js").vendored? - assert sample_blob("cordova-2.1.0.min.js").vendored? - - # Foundation js - assert sample_blob("foundation.js").vendored? - assert sample_blob("foundation.min.js").vendored? - assert sample_blob("foundation.abide.js").vendored? - - # Vagrant - assert sample_blob("Vagrantfile").vendored? - - # Gradle - assert sample_blob("gradlew").vendored? - assert sample_blob("gradlew.bat").vendored? - assert sample_blob("gradle/wrapper/gradle-wrapper.properties").vendored? - assert sample_blob("subproject/gradlew").vendored? - assert sample_blob("subproject/gradlew.bat").vendored? - assert sample_blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored? - - # Octicons - assert sample_blob("octicons.css").vendored? - assert sample_blob("public/octicons.min.css").vendored? - assert sample_blob("public/octicons/sprockets-octicons.scss").vendored? - - # Typesafe Activator - assert sample_blob("activator").vendored? - assert sample_blob("activator.bat").vendored? - assert sample_blob("subproject/activator").vendored? - assert sample_blob("subproject/activator.bat").vendored? - - assert_predicate fixture_blob(".google_apis/bar.jar"), :vendored? - assert_predicate fixture_blob("foo/.google_apis/bar.jar"), :vendored? - - # Sphinx docs - assert sample_blob("docs/_build/asset.doc").vendored? - assert sample_blob("docs/theme/file.css").vendored? - - # Vagrant - assert sample_blob("puphpet/file.pp").vendored? - - # Fabric.io - assert sample_blob("Fabric.framework/Fabric.h").vendored? - - # Crashlytics - assert sample_blob("Crashlytics.framework/Crashlytics.h").vendored? - end - - def test_documentation - assert_predicate fixture_blob("doc/foo.html"), :documentation? - assert_predicate fixture_blob("docs/foo.html"), :documentation? - refute_predicate fixture_blob("project/doc/foo.html"), :documentation? - refute_predicate fixture_blob("project/docs/foo.html"), :documentation? - - assert_predicate fixture_blob("Documentation/foo.md"), :documentation? - assert_predicate fixture_blob("documentation/foo.md"), :documentation? - assert_predicate fixture_blob("project/Documentation/foo.md"), :documentation? - assert_predicate fixture_blob("project/documentation/foo.md"), :documentation? - - assert_predicate fixture_blob("javadoc/foo.html"), :documentation? - assert_predicate fixture_blob("project/javadoc/foo.html"), :documentation? - - assert_predicate fixture_blob("man/foo.html"), :documentation? - refute_predicate fixture_blob("project/man/foo.html"), :documentation? - - assert_predicate fixture_blob("README"), :documentation? - assert_predicate fixture_blob("README.md"), :documentation? - assert_predicate fixture_blob("README.txt"), :documentation? - assert_predicate fixture_blob("Readme"), :documentation? - assert_predicate fixture_blob("readme"), :documentation? - assert_predicate fixture_blob("foo/README"), :documentation? - - assert_predicate fixture_blob("CHANGE"), :documentation? - assert_predicate fixture_blob("CHANGE.md"), :documentation? - assert_predicate fixture_blob("CHANGE.txt"), :documentation? - assert_predicate fixture_blob("foo/CHANGE"), :documentation? - - assert_predicate fixture_blob("CHANGELOG"), :documentation? - assert_predicate fixture_blob("CHANGELOG.md"), :documentation? - assert_predicate fixture_blob("CHANGELOG.txt"), :documentation? - assert_predicate fixture_blob("foo/CHANGELOG"), :documentation? - - assert_predicate fixture_blob("CHANGES"), :documentation? - assert_predicate fixture_blob("CHANGES.md"), :documentation? - assert_predicate fixture_blob("CHANGES.txt"), :documentation? - assert_predicate fixture_blob("foo/CHANGES"), :documentation? - - assert_predicate fixture_blob("CONTRIBUTING"), :documentation? - assert_predicate fixture_blob("CONTRIBUTING.md"), :documentation? - assert_predicate fixture_blob("CONTRIBUTING.txt"), :documentation? - assert_predicate fixture_blob("foo/CONTRIBUTING"), :documentation? - - assert_predicate fixture_blob("examples/some-file.pl"), :documentation? - assert_predicate fixture_blob("Examples/some-example-file.rb"), :documentation? - - assert_predicate fixture_blob("LICENSE"), :documentation? - assert_predicate fixture_blob("LICENCE.md"), :documentation? - assert_predicate fixture_blob("License.txt"), :documentation? - assert_predicate fixture_blob("LICENSE.txt"), :documentation? - assert_predicate fixture_blob("foo/LICENSE"), :documentation? - - assert_predicate fixture_blob("COPYING"), :documentation? - assert_predicate fixture_blob("COPYING.md"), :documentation? - assert_predicate fixture_blob("COPYING.txt"), :documentation? - assert_predicate fixture_blob("foo/COPYING"), :documentation? - - assert_predicate fixture_blob("INSTALL"), :documentation? - assert_predicate fixture_blob("INSTALL.md"), :documentation? - assert_predicate fixture_blob("INSTALL.txt"), :documentation? - assert_predicate fixture_blob("foo/INSTALL"), :documentation? - - refute_predicate fixture_blob("foo.md"), :documentation? - - # Samples - assert sample_blob("Samples/Ruby/foo.rb").documentation? - - assert_predicate fixture_blob("INSTALL.txt"), :documentation? + assert !fixture_blob_memory("Data/README").vendored? end def test_language Samples.each do |sample| - blob = sample_blob(sample[:path]) + blob = sample_blob_memory(sample[:path]) assert blob.language, "No language for #{sample[:path]}" assert_equal sample[:language], blob.language.name, blob.name end @@ -586,7 +245,7 @@ class TestBlob < Minitest::Test filepath = File.join(dirname, filename) next unless File.file?(filepath) - blob = fixture_blob(filepath) + blob = fixture_blob_memory(filepath) if language == 'Data' assert blob.language.nil?, "A language was found for #{filepath}" elsif language == 'Generated' @@ -600,7 +259,7 @@ class TestBlob < Minitest::Test end def test_minified_files_not_safe_to_highlight - assert !sample_blob("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? + assert !sample_blob_memory("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? end def test_empty @@ -613,27 +272,19 @@ class TestBlob < Minitest::Test end def test_include_in_language_stats - vendored = sample_blob("bower_components/custom/custom.js") - assert_predicate vendored, :vendored? - refute_predicate vendored, :include_in_language_stats? - - documentation = fixture_blob("README") - assert_predicate documentation, :documentation? - refute_predicate documentation, :include_in_language_stats? - - generated = sample_blob("CSS/bootstrap.min.css") + generated = sample_blob_memory("CSS/bootstrap.min.css") assert_predicate generated, :generated? refute_predicate generated, :include_in_language_stats? - data = sample_blob("Ant Build System/filenames/ant.xml") + data = sample_blob_memory("Ant Build System/filenames/ant.xml") assert_equal :data, data.language.type refute_predicate data, :include_in_language_stats? - prose = sample_blob("Markdown/tender.md") + prose = sample_blob_memory("Markdown/tender.md") assert_equal :prose, prose.language.type refute_predicate prose, :include_in_language_stats? - included = sample_blob("HTML/pages.html") + included = sample_blob_memory("HTML/pages.html") assert_predicate included, :include_in_language_stats? end end diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index 30d483fe..0ed58807 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -1,9 +1,645 @@ require_relative "./helper" -class TestFileBlob < Minitest::Test +class TestBlob < Minitest::Test + include Linguist + + def setup + # git blobs are normally loaded as ASCII-8BIT since they may contain data + # with arbitrary encoding not known ahead of time + @original_external = Encoding.default_external + Encoding.default_external = Encoding.find("ASCII-8BIT") + end + + def teardown + Encoding.default_external = @original_external + end + + def script_blob(name) + blob = sample_blob(name) + blob.instance_variable_set(:@name, 'script') + blob + end + def test_extensions assert_equal [".gitignore"], Linguist::FileBlob.new(".gitignore").extensions assert_equal [".xml"], Linguist::FileBlob.new("build.xml").extensions assert_equal [".html.erb", ".erb"], Linguist::FileBlob.new("dotted.dir/index.html.erb").extensions end + + def test_name + assert_equal "foo.rb", sample_blob("foo.rb").name + end + + def test_mime_type + assert_equal "application/postscript", fixture_blob("Binary/octocat.ai").mime_type + assert_equal "application/x-ruby", sample_blob("Ruby/grit.rb").mime_type + assert_equal "application/x-sh", sample_blob("Shell/script.sh").mime_type + assert_equal "application/xml", sample_blob("XML/bar.xml").mime_type + assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").mime_type + assert_equal "text/plain", fixture_blob("Data/README").mime_type + end + + def test_content_type + assert_equal "application/pdf", fixture_blob("Binary/foo.pdf").content_type + assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").content_type + assert_equal "image/png", fixture_blob("Binary/foo.png").content_type + assert_equal "text/plain; charset=iso-8859-2", fixture_blob("Data/README").content_type + end + + def test_disposition + assert_equal "attachment; filename=foo+bar.jar", fixture_blob("Binary/foo bar.jar").disposition + assert_equal "attachment; filename=foo.bin", fixture_blob("Binary/foo.bin").disposition + assert_equal "attachment; filename=linguist.gem", fixture_blob("Binary/linguist.gem").disposition + assert_equal "attachment; filename=octocat.ai", fixture_blob("Binary/octocat.ai").disposition + assert_equal "inline", fixture_blob("Data/README").disposition + assert_equal "inline", sample_blob("Text/foo.txt").disposition + assert_equal "inline", sample_blob("Ruby/grit.rb").disposition + assert_equal "inline", fixture_blob("Binary/octocat.png").disposition + end + + def test_data + assert_equal "module Foo\nend\n", sample_blob("Ruby/foo.rb").data + end + + def test_lines + assert_equal ["module Foo", "end", ""], sample_blob("Ruby/foo.rb").lines + assert_equal ["line 1", "line 2", ""], sample_blob("Text/mac.txt").lines + assert_equal 475, sample_blob("Emacs Lisp/ess-julia.el").lines.length + end + + def test_lines_maintains_original_encoding + # Even if the file's encoding is detected as something like UTF-16LE, + # earlier versions of the gem made implicit guarantees that the encoding of + # each `line` is in the same encoding as the file was originally read (in + # practice, UTF-8 or ASCII-8BIT) + assert_equal Encoding.default_external, fixture_blob("Data/utf16le").lines.first.encoding + end + + def test_size + assert_equal 15, sample_blob("Ruby/foo.rb").size + end + + def test_loc + assert_equal 3, sample_blob("Ruby/foo.rb").loc + end + + def test_sloc + assert_equal 2, sample_blob("Ruby/foo.rb").sloc + assert_equal 3, fixture_blob("Data/utf16le-windows").sloc + assert_equal 1, fixture_blob("Data/iso8859-8-i").sloc + end + + def test_encoding + assert_equal "ISO-8859-2", fixture_blob("Data/README").encoding + assert_equal "ISO-8859-2", fixture_blob("Data/README").ruby_encoding + assert_equal "UTF-8", sample_blob("Text/foo.txt").encoding + assert_equal "UTF-8", sample_blob("Text/foo.txt").ruby_encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le").encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le").ruby_encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").ruby_encoding + assert_equal "ISO-2022-KR", sample_blob("Text/ISO-2022-KR.txt").encoding + assert_equal "binary", sample_blob("Text/ISO-2022-KR.txt").ruby_encoding + assert_nil fixture_blob("Binary/dog.o").encoding + end + + def test_binary + # Large blobs aren't loaded + large_blob = sample_blob("git.exe") + large_blob.instance_eval do + def data; end + end + assert large_blob.binary? + + assert fixture_blob("Binary/git.deb").binary? + assert fixture_blob("Binary/git.exe").binary? + assert fixture_blob("Binary/hello.pbc").binary? + assert fixture_blob("Binary/linguist.gem").binary? + assert fixture_blob("Binary/octocat.ai").binary? + assert fixture_blob("Binary/octocat.png").binary? + assert fixture_blob("Binary/zip").binary? + assert !fixture_blob("Data/README").binary? + assert !sample_blob("Ruby/foo.rb").binary? + assert !sample_blob("Perl/script.pl").binary? + end + + def test_all_binary + Samples.each do |sample| + blob = sample_blob(sample[:path]) + assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" + end + end + + def test_text + assert fixture_blob("Data/README").text? + assert fixture_blob("Data/md").text? + assert sample_blob("Shell/script.sh").text? + assert fixture_blob("Data/txt").text? + end + + def test_image + assert fixture_blob("Binary/octocat.gif").image? + assert fixture_blob("Binary/octocat.jpeg").image? + assert fixture_blob("Binary/octocat.jpg").image? + assert fixture_blob("Binary/octocat.png").image? + assert !fixture_blob("Binary/octocat.ai").image? + assert !fixture_blob("Binary/octocat.psd").image? + end + + def test_solid + assert fixture_blob("Binary/cube.stl").solid? + assert fixture_blob("Data/cube.stl").solid? + end + + def test_csv + assert fixture_blob("Data/cars.csv").csv? + end + + def test_pdf + assert fixture_blob("Binary/foo.pdf").pdf? + end + + def test_viewable + assert fixture_blob("Data/README").viewable? + assert sample_blob("Ruby/foo.rb").viewable? + assert sample_blob("Perl/script.pl").viewable? + assert !fixture_blob("Binary/linguist.gem").viewable? + assert !fixture_blob("Binary/octocat.ai").viewable? + assert !fixture_blob("Binary/octocat.png").viewable? + end + + def test_generated + assert !fixture_blob("Data/README").generated? + + # Xcode project files + assert !sample_blob("XML/MainMenu.xib").generated? + assert fixture_blob("Binary/MainMenu.nib").generated? + assert !sample_blob("XML/project.pbxproj").generated? + + # Gemfile.lock is NOT generated + assert !sample_blob("Gemfile.lock").generated? + + # Generated .NET Docfiles + assert sample_blob("XML/net_docfile.xml").generated? + + # Long line + assert !sample_blob("JavaScript/uglify.js").generated? + + # Inlined JS, but mostly code + assert !sample_blob("JavaScript/json2_backbone.js").generated? + + # Minified JS + assert !sample_blob("JavaScript/jquery-1.6.1.js").generated? + assert sample_blob("JavaScript/jquery-1.6.1.min.js").generated? + assert sample_blob("JavaScript/jquery-1.4.2.min.js").generated? + + # CoffeeScript-generated JS + # TODO + + # TypeScript-generated JS + # TODO + + # Composer generated composer.lock file + assert sample_blob("JSON/composer.lock").generated? + + # PEG.js-generated parsers + assert sample_blob("JavaScript/parser.js").generated? + + # Generated PostScript + assert !sample_blob("PostScript/sierpinski.ps").generated? + + # These examples are too basic to tell + assert !sample_blob("JavaScript/hello.js").generated? + + assert sample_blob("JavaScript/intro-old.js").generated? + assert sample_blob("JavaScript/classes-old.js").generated? + + assert sample_blob("JavaScript/intro.js").generated? + assert sample_blob("JavaScript/classes.js").generated? + + # Protocol Buffer generated code + assert sample_blob("C++/protocol-buffer.pb.h").generated? + assert sample_blob("C++/protocol-buffer.pb.cc").generated? + assert sample_blob("Java/ProtocolBuffer.java").generated? + assert sample_blob("Python/protocol_buffer_pb2.py").generated? + assert sample_blob("Go/api.pb.go").generated? + assert sample_blob("Go/embedded.go").generated? + + # Apache Thrift generated code + assert sample_blob("Python/gen-py-linguist-thrift.py").generated? + assert sample_blob("Go/gen-go-linguist-thrift.go").generated? + assert sample_blob("Java/gen-java-linguist-thrift.java").generated? + assert sample_blob("JavaScript/gen-js-linguist-thrift.js").generated? + assert sample_blob("Ruby/gen-rb-linguist-thrift.rb").generated? + assert sample_blob("Objective-C/gen-cocoa-linguist-thrift.m").generated? + + # Generated JNI + assert sample_blob("C/jni_layer.h").generated? + + # Minified CSS + assert !sample_blob("CSS/bootstrap.css").generated? + assert sample_blob("CSS/bootstrap.min.css").generated? + + # Generated VCR + assert sample_blob("YAML/vcr_cassette.yml").generated? + + # Generated by Zephir + assert sample_blob("Zephir/filenames/exception.zep.c").generated? + assert sample_blob("Zephir/filenames/exception.zep.h").generated? + assert sample_blob("Zephir/filenames/exception.zep.php").generated? + assert !sample_blob("Zephir/Router.zep").generated? + + assert sample_blob("node_modules/grunt/lib/grunt.js").generated? + + # Godep saved dependencies + assert sample_blob("Godeps/Godeps.json").generated? + assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated? + + # Cython-generated C/C++ + assert sample_blob("C/sgd_fast.c").generated? + assert sample_blob("C++/wrapper_inner.cpp").generated? + + # Unity3D-generated metadata + assert sample_blob("Unity3D Asset/Tiles.meta").generated? + end + + def test_vendored + assert !fixture_blob("Data/README").vendored? + assert !sample_blob("ext/extconf.rb").vendored? + + # Dependencies + assert sample_blob("dependencies/windows/headers/GL/glext.h").vendored? + + # Node dependencies + assert sample_blob("node_modules/coffee-script/lib/coffee-script.js").vendored? + + # Bower Components + assert sample_blob("bower_components/custom/custom.js").vendored? + assert sample_blob("app/bower_components/custom/custom.js").vendored? + assert sample_blob("vendor/assets/bower_components/custom/custom.js").vendored? + + # Go dependencies + assert !sample_blob("Godeps/Godeps.json").vendored? + assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored? + + # Rails vendor/ + assert sample_blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored? + + # Vendor/ + assert sample_blob("Vendor/my_great_file.h").vendored? + + # 'thirdparty' directory + assert sample_blob("thirdparty/lib/main.c").vendored? + + # 'extern(al)' directory + assert sample_blob("extern/util/__init__.py").vendored? + assert sample_blob("external/jquery.min.js").vendored? + + # C deps + assert sample_blob("deps/http_parser/http_parser.c").vendored? + assert sample_blob("deps/v8/src/v8.h").vendored? + + assert sample_blob("tools/something/else.c").vendored? + + # Chart.js + assert sample_blob("some/vendored/path/Chart.js").vendored? + assert !sample_blob("some/vendored/path/chart.js").vendored? + + # Codemirror deps + assert sample_blob("codemirror/mode/blah.js").vendored? + + # Debian packaging + assert sample_blob("debian/cron.d").vendored? + + # Erlang + assert sample_blob("rebar").vendored? + + # git config files + + assert_predicate fixture_blob("some/path/.gitattributes"), :vendored? + assert_predicate fixture_blob(".gitignore"), :vendored? + assert_predicate fixture_blob("special/path/.gitmodules"), :vendored? + + # Minified JavaScript and CSS + assert sample_blob("foo.min.js").vendored? + assert sample_blob("foo.min.css").vendored? + assert sample_blob("foo-min.js").vendored? + assert sample_blob("foo-min.css").vendored? + assert !sample_blob("foomin.css").vendored? + assert !sample_blob("foo.min.txt").vendored? + + #.osx + assert sample_blob(".osx").vendored? + + # Prototype + assert !sample_blob("public/javascripts/application.js").vendored? + assert sample_blob("public/javascripts/prototype.js").vendored? + assert sample_blob("public/javascripts/effects.js").vendored? + assert sample_blob("public/javascripts/controls.js").vendored? + assert sample_blob("public/javascripts/dragdrop.js").vendored? + + # jQuery + assert sample_blob("jquery.js").vendored? + assert sample_blob("public/javascripts/jquery.js").vendored? + assert sample_blob("public/javascripts/jquery.min.js").vendored? + assert sample_blob("public/javascripts/jquery-1.7.js").vendored? + assert sample_blob("public/javascripts/jquery-1.7.min.js").vendored? + assert sample_blob("public/javascripts/jquery-1.5.2.js").vendored? + assert sample_blob("public/javascripts/jquery-1.6.1.js").vendored? + assert sample_blob("public/javascripts/jquery-1.6.1.min.js").vendored? + assert sample_blob("public/javascripts/jquery-1.10.1.js").vendored? + assert sample_blob("public/javascripts/jquery-1.10.1.min.js").vendored? + assert !sample_blob("public/javascripts/jquery.github.menu.js").vendored? + + # jQuery UI + assert sample_blob("themes/ui-lightness/jquery-ui.css").vendored? + assert sample_blob("themes/ui-lightness/jquery-ui-1.8.22.custom.css").vendored? + assert sample_blob("themes/ui-lightness/jquery.ui.accordion.css").vendored? + assert sample_blob("ui/i18n/jquery.ui.datepicker-ar.js").vendored? + assert sample_blob("ui/i18n/jquery-ui-i18n.js").vendored? + assert sample_blob("ui/jquery.effects.blind.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.22.custom.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.22.custom.min.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.22.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.js").vendored? + assert sample_blob("ui/jquery-ui.min.js").vendored? + assert sample_blob("ui/jquery.ui.accordion.js").vendored? + assert sample_blob("ui/minified/jquery.effects.blind.min.js").vendored? + assert sample_blob("ui/minified/jquery.ui.accordion.min.js").vendored? + + # MooTools + assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored? + assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored? + + # Dojo + assert sample_blob("public/javascripts/dojo.js").vendored? + + # MochiKit + assert sample_blob("public/javascripts/MochiKit.js").vendored? + + # YUI + assert sample_blob("public/javascripts/yahoo-dom-event.js").vendored? + assert sample_blob("public/javascripts/yahoo-min.js").vendored? + assert sample_blob("public/javascripts/yuiloader-dom-event.js").vendored? + + # WYS editors + assert sample_blob("public/javascripts/ckeditor.js").vendored? + assert sample_blob("public/javascripts/tiny_mce.js").vendored? + assert sample_blob("public/javascripts/tiny_mce_popup.js").vendored? + assert sample_blob("public/javascripts/tiny_mce_src.js").vendored? + + # AngularJS + assert sample_blob("public/javascripts/angular.js").vendored? + assert sample_blob("public/javascripts/angular.min.js").vendored? + + # D3.js + assert sample_blob("public/javascripts/d3.v3.js").vendored? + assert sample_blob("public/javascripts/d3.v3.min.js").vendored? + + # Modernizr + assert sample_blob("public/javascripts/modernizr-2.7.1.js").vendored? + assert sample_blob("public/javascripts/modernizr.custom.01009.js").vendored? + + # Fabric + assert sample_blob("fabfile.py").vendored? + + # WAF + assert sample_blob("waf").vendored? + + # Visual Studio IntelliSense + assert sample_blob("Scripts/jquery-1.7-vsdoc.js").vendored? + + # Microsoft Ajax + assert sample_blob("Scripts/MicrosoftAjax.debug.js").vendored? + assert sample_blob("Scripts/MicrosoftAjax.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcAjax.debug.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcAjax.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcValidation.debug.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcValidation.js").vendored? + + # jQuery validation plugin (MS bundles this with asp.net mvc) + assert sample_blob("Scripts/jquery.validate.js").vendored? + assert sample_blob("Scripts/jquery.validate.min.js").vendored? + assert sample_blob("Scripts/jquery.validate.unobtrusive.js").vendored? + assert sample_blob("Scripts/jquery.validate.unobtrusive.min.js").vendored? + assert sample_blob("Scripts/jquery.unobtrusive-ajax.js").vendored? + assert sample_blob("Scripts/jquery.unobtrusive-ajax.min.js").vendored? + + # NuGet Packages + assert sample_blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? + + # Font Awesome + assert sample_blob("some/asset/path/font-awesome.min.css").vendored? + assert sample_blob("some/asset/path/font-awesome.css").vendored? + + # Normalize + assert sample_blob("some/asset/path/normalize.css").vendored? + + # Carthage + assert sample_blob('Carthage/blah').vendored? + + # Cocoapods + assert sample_blob('Pods/blah').vendored? + + # Html5shiv + assert sample_blob("Scripts/html5shiv.js").vendored? + assert sample_blob("Scripts/html5shiv.min.js").vendored? + + # Test fixtures + assert sample_blob("test/fixtures/random.rkt").vendored? + assert sample_blob("Test/fixtures/random.rkt").vendored? + assert sample_blob("tests/fixtures/random.rkt").vendored? + + # Cordova/PhoneGap + assert sample_blob("cordova.js").vendored? + assert sample_blob("cordova.min.js").vendored? + assert sample_blob("cordova-2.1.0.js").vendored? + assert sample_blob("cordova-2.1.0.min.js").vendored? + + # Foundation js + assert sample_blob("foundation.js").vendored? + assert sample_blob("foundation.min.js").vendored? + assert sample_blob("foundation.abide.js").vendored? + + # Vagrant + assert sample_blob("Vagrantfile").vendored? + + # Gradle + assert sample_blob("gradlew").vendored? + assert sample_blob("gradlew.bat").vendored? + assert sample_blob("gradle/wrapper/gradle-wrapper.properties").vendored? + assert sample_blob("subproject/gradlew").vendored? + assert sample_blob("subproject/gradlew.bat").vendored? + assert sample_blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored? + + # Octicons + assert sample_blob("octicons.css").vendored? + assert sample_blob("public/octicons.min.css").vendored? + assert sample_blob("public/octicons/sprockets-octicons.scss").vendored? + + # Typesafe Activator + assert sample_blob("activator").vendored? + assert sample_blob("activator.bat").vendored? + assert sample_blob("subproject/activator").vendored? + assert sample_blob("subproject/activator.bat").vendored? + + assert_predicate fixture_blob(".google_apis/bar.jar"), :vendored? + assert_predicate fixture_blob("foo/.google_apis/bar.jar"), :vendored? + + # Sphinx docs + assert sample_blob("docs/_build/asset.doc").vendored? + assert sample_blob("docs/theme/file.css").vendored? + + # Vagrant + assert sample_blob("puphpet/file.pp").vendored? + + # Fabric.io + assert sample_blob("Fabric.framework/Fabric.h").vendored? + + # Crashlytics + assert sample_blob("Crashlytics.framework/Crashlytics.h").vendored? + end + + def test_documentation + assert_predicate fixture_blob("doc/foo.html"), :documentation? + assert_predicate fixture_blob("docs/foo.html"), :documentation? + refute_predicate fixture_blob("project/doc/foo.html"), :documentation? + refute_predicate fixture_blob("project/docs/foo.html"), :documentation? + + assert_predicate fixture_blob("Documentation/foo.md"), :documentation? + assert_predicate fixture_blob("documentation/foo.md"), :documentation? + assert_predicate fixture_blob("project/Documentation/foo.md"), :documentation? + assert_predicate fixture_blob("project/documentation/foo.md"), :documentation? + + assert_predicate fixture_blob("javadoc/foo.html"), :documentation? + assert_predicate fixture_blob("project/javadoc/foo.html"), :documentation? + + assert_predicate fixture_blob("man/foo.html"), :documentation? + refute_predicate fixture_blob("project/man/foo.html"), :documentation? + + assert_predicate fixture_blob("README"), :documentation? + assert_predicate fixture_blob("README.md"), :documentation? + assert_predicate fixture_blob("README.txt"), :documentation? + assert_predicate fixture_blob("Readme"), :documentation? + assert_predicate fixture_blob("readme"), :documentation? + assert_predicate fixture_blob("foo/README"), :documentation? + + assert_predicate fixture_blob("CHANGE"), :documentation? + assert_predicate fixture_blob("CHANGE.md"), :documentation? + assert_predicate fixture_blob("CHANGE.txt"), :documentation? + assert_predicate fixture_blob("foo/CHANGE"), :documentation? + + assert_predicate fixture_blob("CHANGELOG"), :documentation? + assert_predicate fixture_blob("CHANGELOG.md"), :documentation? + assert_predicate fixture_blob("CHANGELOG.txt"), :documentation? + assert_predicate fixture_blob("foo/CHANGELOG"), :documentation? + + assert_predicate fixture_blob("CHANGES"), :documentation? + assert_predicate fixture_blob("CHANGES.md"), :documentation? + assert_predicate fixture_blob("CHANGES.txt"), :documentation? + assert_predicate fixture_blob("foo/CHANGES"), :documentation? + + assert_predicate fixture_blob("CONTRIBUTING"), :documentation? + assert_predicate fixture_blob("CONTRIBUTING.md"), :documentation? + assert_predicate fixture_blob("CONTRIBUTING.txt"), :documentation? + assert_predicate fixture_blob("foo/CONTRIBUTING"), :documentation? + + assert_predicate fixture_blob("examples/some-file.pl"), :documentation? + assert_predicate fixture_blob("Examples/some-example-file.rb"), :documentation? + + assert_predicate fixture_blob("LICENSE"), :documentation? + assert_predicate fixture_blob("LICENCE.md"), :documentation? + assert_predicate fixture_blob("License.txt"), :documentation? + assert_predicate fixture_blob("LICENSE.txt"), :documentation? + assert_predicate fixture_blob("foo/LICENSE"), :documentation? + + assert_predicate fixture_blob("COPYING"), :documentation? + assert_predicate fixture_blob("COPYING.md"), :documentation? + assert_predicate fixture_blob("COPYING.txt"), :documentation? + assert_predicate fixture_blob("foo/COPYING"), :documentation? + + assert_predicate fixture_blob("INSTALL"), :documentation? + assert_predicate fixture_blob("INSTALL.md"), :documentation? + assert_predicate fixture_blob("INSTALL.txt"), :documentation? + assert_predicate fixture_blob("foo/INSTALL"), :documentation? + + refute_predicate fixture_blob("foo.md"), :documentation? + + # Samples + assert sample_blob("Samples/Ruby/foo.rb").documentation? + + assert_predicate fixture_blob("INSTALL.txt"), :documentation? + end + + def test_language + Samples.each do |sample| + blob = sample_blob(sample[:path]) + assert blob.language, "No language for #{sample[:path]}" + assert_equal sample[:language], blob.language.name, blob.name + end + + # Test language detection for files which shouldn't be used as samples + root = File.expand_path('../fixtures', __FILE__) + Dir.entries(root).each do |language| + next if language == '.' || language == '..' || language == 'Binary' || + File.basename(language) == 'ace_modes.json' + + # Each directory contains test files of a language + dirname = File.join(root, language) + Dir.entries(dirname).each do |filename| + # By default blob search the file in the samples; + # thus, we need to give it the absolute path + filepath = File.join(dirname, filename) + next unless File.file?(filepath) + + blob = fixture_blob(filepath) + if language == 'Data' + assert blob.language.nil?, "A language was found for #{filepath}" + elsif language == 'Generated' + assert blob.generated?, "#{filepath} is not a generated file" + else + assert blob.language, "No language for #{filepath}" + assert_equal language, blob.language.name, blob.name + end + end + end + end + + def test_minified_files_not_safe_to_highlight + assert !sample_blob("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? + end + + def test_empty + blob = Struct.new(:data) { include Linguist::BlobHelper } + + assert blob.new("").empty? + assert blob.new(nil).empty? + refute blob.new(" ").empty? + refute blob.new("nope").empty? + end + + def test_include_in_language_stats + vendored = sample_blob("bower_components/custom/custom.js") + assert_predicate vendored, :vendored? + refute_predicate vendored, :include_in_language_stats? + + documentation = fixture_blob("README") + assert_predicate documentation, :documentation? + refute_predicate documentation, :include_in_language_stats? + + generated = sample_blob("CSS/bootstrap.min.css") + assert_predicate generated, :generated? + refute_predicate generated, :include_in_language_stats? + + data = sample_blob("Ant Build System/filenames/ant.xml") + assert_equal :data, data.language.type + refute_predicate data, :include_in_language_stats? + + prose = sample_blob("Markdown/tender.md") + assert_equal :prose, prose.language.type + refute_predicate prose, :include_in_language_stats? + + included = sample_blob("HTML/pages.html") + assert_predicate included, :include_in_language_stats? + end end diff --git a/test/test_memory_blob.rb b/test/test_memory_blob.rb deleted file mode 100644 index 1ba856de..00000000 --- a/test/test_memory_blob.rb +++ /dev/null @@ -1,290 +0,0 @@ -require_relative "./helper" - -class TestBlob < Minitest::Test - include Linguist - - def setup - # git blobs are normally loaded as ASCII-8BIT since they may contain data - # with arbitrary encoding not known ahead of time - @original_external = Encoding.default_external - Encoding.default_external = Encoding.find("ASCII-8BIT") - end - - def teardown - Encoding.default_external = @original_external - end - - def script_blob(name) - blob = sample_blob_memory(name) - blob.instance_variable_set(:@name, 'script') - blob - end - - def test_name - assert_equal "foo.rb", sample_blob_memory("Ruby/foo.rb").name - end - - def test_mime_type - assert_equal "application/postscript", fixture_blob_memory("Binary/octocat.ai").mime_type - assert_equal "application/x-ruby", sample_blob_memory("Ruby/grit.rb").mime_type - assert_equal "application/x-sh", sample_blob_memory("Shell/script.sh").mime_type - assert_equal "text/plain", fixture_blob_memory("Data/README").mime_type - end - - def test_content_type - assert_equal "application/pdf", fixture_blob_memory("Binary/foo.pdf").content_type - assert_equal "image/png", fixture_blob_memory("Binary/foo.png").content_type - assert_equal "text/plain; charset=iso-8859-2", fixture_blob_memory("Data/README").content_type - end - - def test_disposition - assert_equal "attachment; filename=foo+bar.jar", fixture_blob_memory("Binary/foo bar.jar").disposition - assert_equal "attachment; filename=foo.bin", fixture_blob_memory("Binary/foo.bin").disposition - assert_equal "attachment; filename=linguist.gem", fixture_blob_memory("Binary/linguist.gem").disposition - assert_equal "attachment; filename=octocat.ai", fixture_blob_memory("Binary/octocat.ai").disposition - assert_equal "inline", fixture_blob_memory("Data/README").disposition - assert_equal "inline", sample_blob_memory("Text/foo.txt").disposition - assert_equal "inline", sample_blob_memory("Ruby/grit.rb").disposition - assert_equal "inline", fixture_blob_memory("Binary/octocat.png").disposition - end - - def test_data - assert_equal "module Foo\nend\n", sample_blob_memory("Ruby/foo.rb").data - end - - def test_lines - assert_equal ["module Foo", "end", ""], sample_blob_memory("Ruby/foo.rb").lines - assert_equal ["line 1", "line 2", ""], sample_blob_memory("Text/mac.txt").lines - assert_equal 475, sample_blob_memory("Emacs Lisp/ess-julia.el").lines.length - end - - def test_lines_maintains_original_encoding - # Even if the file's encoding is detected as something like UTF-16LE, - # earlier versions of the gem made implicit guarantees that the encoding of - # each `line` is in the same encoding as the file was originally read (in - # practice, UTF-8 or ASCII-8BIT) - assert_equal Encoding.default_external, fixture_blob_memory("Data/utf16le").lines.first.encoding - end - - def test_size - assert_equal 15, sample_blob_memory("Ruby/foo.rb").size - end - - def test_loc - assert_equal 3, sample_blob_memory("Ruby/foo.rb").loc - end - - def test_sloc - assert_equal 2, sample_blob_memory("Ruby/foo.rb").sloc - assert_equal 3, fixture_blob_memory("Data/utf16le-windows").sloc - assert_equal 1, fixture_blob_memory("Data/iso8859-8-i").sloc - end - - def test_encoding - assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").encoding - assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").ruby_encoding - assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").encoding - assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").ruby_encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").ruby_encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").ruby_encoding - assert_equal "ISO-2022-KR", sample_blob_memory("Text/ISO-2022-KR.txt").encoding - assert_equal "binary", sample_blob_memory("Text/ISO-2022-KR.txt").ruby_encoding - assert_nil fixture_blob_memory("Binary/dog.o").encoding - end - - def test_binary - assert fixture_blob_memory("Binary/git.deb").binary? - assert fixture_blob_memory("Binary/hello.pbc").binary? - assert fixture_blob_memory("Binary/linguist.gem").binary? - assert fixture_blob_memory("Binary/octocat.ai").binary? - assert fixture_blob_memory("Binary/octocat.png").binary? - assert fixture_blob_memory("Binary/zip").binary? - assert !fixture_blob_memory("Data/README").binary? - assert !sample_blob_memory("Ruby/foo.rb").binary? - assert !sample_blob_memory("Perl/script.pl").binary? - end - - def test_all_binary - Samples.each do |sample| - blob = sample_blob_memory(sample[:path]) - assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" - end - end - - def test_text - assert fixture_blob_memory("Data/README").text? - assert fixture_blob_memory("Data/md").text? - assert sample_blob_memory("Shell/script.sh").text? - assert fixture_blob_memory("Data/txt").text? - end - - def test_image - assert fixture_blob_memory("Binary/octocat.png").image? - assert !fixture_blob_memory("Binary/octocat.ai").image? - assert !fixture_blob_memory("Binary/octocat.psd").image? - end - - def test_solid - assert fixture_blob_memory("Binary/cube.stl").solid? - assert fixture_blob_memory("Data/cube.stl").solid? - end - - def test_csv - assert fixture_blob_memory("Data/cars.csv").csv? - end - - def test_pdf - assert fixture_blob_memory("Binary/foo.pdf").pdf? - end - - def test_viewable - assert fixture_blob_memory("Data/README").viewable? - assert sample_blob_memory("Ruby/foo.rb").viewable? - assert sample_blob_memory("Perl/script.pl").viewable? - assert !fixture_blob_memory("Binary/linguist.gem").viewable? - assert !fixture_blob_memory("Binary/octocat.ai").viewable? - assert !fixture_blob_memory("Binary/octocat.png").viewable? - end - - def test_generated - assert !fixture_blob_memory("Data/README").generated? - - # Generated .NET Docfiles - assert sample_blob_memory("XML/net_docfile.xml").generated? - - # Long line - assert !sample_blob_memory("JavaScript/uglify.js").generated? - - # Inlined JS, but mostly code - assert !sample_blob_memory("JavaScript/json2_backbone.js").generated? - - # Minified JS - assert !sample_blob_memory("JavaScript/jquery-1.6.1.js").generated? - assert sample_blob_memory("JavaScript/jquery-1.6.1.min.js").generated? - assert sample_blob_memory("JavaScript/jquery-1.4.2.min.js").generated? - - # Composer generated composer.lock file - assert sample_blob_memory("JSON/composer.lock").generated? - - # PEG.js-generated parsers - assert sample_blob_memory("JavaScript/parser.js").generated? - - # Generated PostScript - assert !sample_blob_memory("PostScript/sierpinski.ps").generated? - - # These examples are too basic to tell - assert !sample_blob_memory("JavaScript/hello.js").generated? - - assert sample_blob_memory("JavaScript/intro-old.js").generated? - assert sample_blob_memory("JavaScript/classes-old.js").generated? - - assert sample_blob_memory("JavaScript/intro.js").generated? - assert sample_blob_memory("JavaScript/classes.js").generated? - - # Protocol Buffer generated code - assert sample_blob_memory("C++/protocol-buffer.pb.h").generated? - assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated? - assert sample_blob_memory("Java/ProtocolBuffer.java").generated? - assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated? - assert sample_blob_memory("Go/api.pb.go").generated? - assert sample_blob_memory("Go/embedded.go").generated? - - # Apache Thrift generated code - assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated? - assert sample_blob_memory("Go/gen-go-linguist-thrift.go").generated? - assert sample_blob_memory("Java/gen-java-linguist-thrift.java").generated? - assert sample_blob_memory("JavaScript/gen-js-linguist-thrift.js").generated? - assert sample_blob_memory("Ruby/gen-rb-linguist-thrift.rb").generated? - assert sample_blob_memory("Objective-C/gen-cocoa-linguist-thrift.m").generated? - - # Generated JNI - assert sample_blob_memory("C/jni_layer.h").generated? - - # Minified CSS - assert !sample_blob_memory("CSS/bootstrap.css").generated? - assert sample_blob_memory("CSS/bootstrap.min.css").generated? - - # Generated VCR - assert sample_blob_memory("YAML/vcr_cassette.yml").generated? - - # Generated by Zephir - assert !sample_blob_memory("Zephir/Router.zep").generated? - - # Cython-generated C/C++ - assert sample_blob_memory("C/sgd_fast.c").generated? - assert sample_blob_memory("C++/wrapper_inner.cpp").generated? - - # Unity3D-generated metadata - assert sample_blob_memory("Unity3D Asset/Tiles.meta").generated? - end - - def test_vendored - assert !fixture_blob_memory("Data/README").vendored? - end - - def test_language - Samples.each do |sample| - blob = sample_blob_memory(sample[:path]) - assert blob.language, "No language for #{sample[:path]}" - assert_equal sample[:language], blob.language.name, blob.name - end - - # Test language detection for files which shouldn't be used as samples - root = File.expand_path('../fixtures', __FILE__) - Dir.entries(root).each do |language| - next if language == '.' || language == '..' || language == 'Binary' || - File.basename(language) == 'ace_modes.json' - - # Each directory contains test files of a language - dirname = File.join(root, language) - Dir.entries(dirname).each do |filename| - # By default blob search the file in the samples; - # thus, we need to give it the absolute path - filepath = File.join(dirname, filename) - next unless File.file?(filepath) - - blob = fixture_blob_memory(filepath) - if language == 'Data' - assert blob.language.nil?, "A language was found for #{filepath}" - elsif language == 'Generated' - assert blob.generated?, "#{filepath} is not a generated file" - else - assert blob.language, "No language for #{filepath}" - assert_equal language, blob.language.name, blob.name - end - end - end - end - - def test_minified_files_not_safe_to_highlight - assert !sample_blob_memory("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? - end - - def test_empty - blob = Struct.new(:data) { include Linguist::BlobHelper } - - assert blob.new("").empty? - assert blob.new(nil).empty? - refute blob.new(" ").empty? - refute blob.new("nope").empty? - end - - def test_include_in_language_stats - generated = sample_blob_memory("CSS/bootstrap.min.css") - assert_predicate generated, :generated? - refute_predicate generated, :include_in_language_stats? - - data = sample_blob_memory("Ant Build System/filenames/ant.xml") - assert_equal :data, data.language.type - refute_predicate data, :include_in_language_stats? - - prose = sample_blob_memory("Markdown/tender.md") - assert_equal :prose, prose.language.type - refute_predicate prose, :include_in_language_stats? - - included = sample_blob_memory("HTML/pages.html") - assert_predicate included, :include_in_language_stats? - end -end From 96518d2d0f5bdfb01f6a0598193876d4bf942fad Mon Sep 17 00:00:00 2001 From: LeonaMorro Date: Fri, 21 Aug 2015 11:17:12 +0200 Subject: [PATCH 005/227] added *.lslp as LSL(Linden Scripting Language) --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 5b31ed4f..0d552ac7 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1719,6 +1719,7 @@ LSL: ace_mode: lsl extensions: - .lsl + - .lslp interpreters: - lsl color: '#3d9970' From e922b7c2cae45c1b93f35035c4dc6383fadddcfb Mon Sep 17 00:00:00 2001 From: LeonaMorro Date: Fri, 21 Aug 2015 11:44:23 +0200 Subject: [PATCH 006/227] added *.lslp to samples/LSL folder --- samples/LSL/LSL.lslp | 74 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 samples/LSL/LSL.lslp diff --git a/samples/LSL/LSL.lslp b/samples/LSL/LSL.lslp new file mode 100644 index 00000000..5d281b95 --- /dev/null +++ b/samples/LSL/LSL.lslp @@ -0,0 +1,74 @@ +/* + Testing syntax highlighting + for the Linden Scripting Language +*/ + +integer someIntNormal = 3672; +integer someIntHex = 0x00000000; +integer someIntMath = PI_BY_TWO; + +integer event = 5673;// 'event' is invalid.illegal + +key someKeyTexture = TEXTURE_DEFAULT; +string someStringSpecial = EOF; + +some_user_defined_function_without_return_type(string inputAsString) +{ + llSay(PUBLIC_CHANNEL, inputAsString); +} + +string user_defined_function_returning_a_string(key inputAsKey) +{ + return (string)inputAsKey; +} + +default +{ + state_entry() + { + key someKey = NULL_KEY; + someKey = llGetOwner(); + + string someString = user_defined_function_returning_a_string(someKey); + + some_user_defined_function_without_return_type(someString); + } + + touch_start(integer num_detected) + { + list agentsInRegion = llGetAgentList(AGENT_LIST_REGION, []); + integer numOfAgents = llGetListLength(agentsInRegion); + + integer index; // defaults to 0 + for (; index <= numOfAgents - 1; index++) // for each agent in region + { + llRegionSayTo(llList2Key(agentsInRegion, index), PUBLIC_CHANNEL, "Hello, Avatar!"); + } + } + + touch_end(integer num_detected) + { + someIntNormal = 3672; + someIntHex = 0x00000000; + someIntMath = PI_BY_TWO; + + event = 5673;// 'event' is invalid.illegal + + someKeyTexture = TEXTURE_DEFAULT; + someStringSpecial = EOF; + + llSetInventoryPermMask("some item", MASK_NEXT, PERM_ALL);// 'llSetInventoryPermMask' is reserved.godmode + + llWhisper(PUBLIC_CHANNEL, "Leaving \"default\" now..."); + state other; + } +} + +state other +{ + state_entry() + { + llWhisper(PUBLIC_CHANNEL, "Entered \"state other\", returning to \"default\" again..."); + state default; + } +} From 7025cbe760f191e00c30c4847ae0e4dd467e1fc8 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Fri, 21 Aug 2015 12:12:52 +0200 Subject: [PATCH 007/227] Fix CodeMirror regex for vendored files --- lib/linguist/vendor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index ed89eda8..314fe956 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -122,7 +122,7 @@ - (^|/)Chart\.js$ # Codemirror -- (^|/)[Cc]ode[Mm]irror/(lib|mode|theme|addon|keymap|demo) +- (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo) # SyntaxHighlighter - http://alexgorbatchev.com/ - (^|/)shBrush([^.]*)\.js$ From 1d9faff4c60e33fbdd0de8907ad2758279b19dd8 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Fri, 21 Aug 2015 12:13:42 +0200 Subject: [PATCH 008/227] New JS vendored files --- lib/linguist/vendor.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index 314fe956..73b1071e 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -78,6 +78,9 @@ # Haxelib projects often contain a neko bytecode file named run.n - run.n$ +# Bootstrap Datepicker +- bootstrap-datepicker/ + ## Commonly Bundled JavaScript frameworks ## # jQuery @@ -88,6 +91,30 @@ - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$ - (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$ +# jQuery Gantt +- jquery.fn.gantt.js + +# jQuery fancyBox +- jquery.fancybox.js + +# Fuel UX +- fuelux.js + +# jQuery File Upload +- (^|/)jquery\.fileupload(-\w+)?\.js$ + +# Slick +- (^|/)slick\.(core|dataview|editors|formatters|grid|groupitemmetadataprovider|remotemodel)\.js$ + +# Leaflet plugins +- (^|/)Leaflet\.Coordinates-\d+\.\d+\.\d+\.src\.js$ +- leaflet.draw-src.js +- leaflet.draw.css +- Control.FullScreen.css +- Control.FullScreen.js +- leaflet.spin.js +- wicket-leaflet.js + # Prototype - (^|/)prototype(.*)\.js$ - (^|/)effects\.js$ From 4e6e69833d9b9c46395dbaecde66de1fe5916f0e Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Fri, 21 Aug 2015 12:15:17 +0200 Subject: [PATCH 009/227] Test for new CodeMirror regexp --- test/test_blob.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_blob.rb b/test/test_blob.rb index 0a1cefe9..46869987 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -301,6 +301,7 @@ class TestBlob < Minitest::Test # Codemirror deps assert sample_blob("codemirror/mode/blah.js").vendored? + assert sample_blob("codemirror/5.0/mode/blah.js").vendored? # Debian packaging assert sample_blob("debian/cron.d").vendored? From e6b4428614664c5d72d7b799eb73d885e39f3cbc Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Fri, 21 Aug 2015 12:24:04 +0200 Subject: [PATCH 010/227] Tests for new vendored files --- test/test_blob.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/test_blob.rb b/test/test_blob.rb index 46869987..ca9640c4 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -362,6 +362,26 @@ class TestBlob < Minitest::Test assert sample_blob("ui/minified/jquery.effects.blind.min.js").vendored? assert sample_blob("ui/minified/jquery.ui.accordion.min.js").vendored? + # jQuery Gantt + assert sample_blob("web-app/jquery-gantt/js/jquery.fn.gantt.js").vendored? + + # jQuery fancyBox + assert sample_blob("web-app/fancybox/jquery.fancybox.js").vendored? + + # Fuel UX + assert sample_blob("web-app/fuelux/js/fuelux.js").vendored? + + # jQuery File Upload + assert sample_blob("fileupload-9.0.0/jquery.fileupload-process.js").vendored? + + # Slick + assert sample_blob("web-app/slickgrid/controls/slick.columnpicker.js").vendored? + + # Leaflet plugins + assert sample_blob("leaflet-plugins/Leaflet.Coordinates-0.5.0.src.js").vendored? + assert sample_blob("leaflet-plugins/leaflet.draw-src.js").vendored? + assert sample_blob("leaflet-plugins/leaflet.spin.js").vendored? + # MooTools assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored? assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored? From c0fff6c8a8e560188004b801d8cfe60da49e89e7 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Fri, 21 Aug 2015 12:30:01 +0200 Subject: [PATCH 011/227] Make Slick regexp more general --- lib/linguist/vendor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index 73b1071e..cf312d89 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -104,7 +104,7 @@ - (^|/)jquery\.fileupload(-\w+)?\.js$ # Slick -- (^|/)slick\.(core|dataview|editors|formatters|grid|groupitemmetadataprovider|remotemodel)\.js$ +- (^|/)slick\.\w+.js$ # Leaflet plugins - (^|/)Leaflet\.Coordinates-\d+\.\d+\.\d+\.src\.js$ From 0d8e0a29702d94ae83f1e2003ca23bc8fc4468c0 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Mon, 24 Aug 2015 12:32:26 +0200 Subject: [PATCH 012/227] Sublime Text workspace files as vendored --- lib/linguist/vendor.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index cf312d89..d5965bb2 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -115,6 +115,10 @@ - leaflet.spin.js - wicket-leaflet.js +# Sublime Text workspace files +- .sublime-project +- .sublime-workspace + # Prototype - (^|/)prototype(.*)\.js$ - (^|/)effects\.js$ From 25a1af3775fade12c9b3c024ac5137ac063a513c Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Mon, 24 Aug 2015 13:26:43 -0400 Subject: [PATCH 013/227] Add the X10 language (http://x10-lang.org/). --- .gitmodules | 3 + grammars.yml | 2 + lib/linguist/languages.yml | 10 ++ samples/X10/ArraySum.x10 | 72 ++++++++++++ samples/X10/Cancellation.x10 | 50 +++++++++ samples/X10/Fibonacci.x10 | 52 +++++++++ samples/X10/HeatTransfer_v0.x10 | 86 ++++++++++++++ samples/X10/HeatTransfer_v1.x10 | 114 +++++++++++++++++++ samples/X10/HelloWholeWorld.x10 | 44 ++++++++ samples/X10/HelloWorld.x10 | 23 ++++ samples/X10/Histogram.x10 | 45 ++++++++ samples/X10/Integrate.x10 | 55 +++++++++ samples/X10/KMeans.x10 | 151 +++++++++++++++++++++++++ samples/X10/KMeansDist.x10 | 147 ++++++++++++++++++++++++ samples/X10/KMeansDistPlh.x10 | 144 ++++++++++++++++++++++++ samples/X10/KMeansSPMD.x10 | 192 ++++++++++++++++++++++++++++++++ samples/X10/MontyPi.x10 | 42 +++++++ samples/X10/NQueensDist.x10 | 123 ++++++++++++++++++++ samples/X10/NQueensPar.x10 | 117 +++++++++++++++++++ samples/X10/QSort.x10 | 73 ++++++++++++ samples/X10/StructSpheres.x10 | 123 ++++++++++++++++++++ vendor/grammars/X10 | 1 + 22 files changed, 1669 insertions(+) create mode 100644 samples/X10/ArraySum.x10 create mode 100644 samples/X10/Cancellation.x10 create mode 100644 samples/X10/Fibonacci.x10 create mode 100644 samples/X10/HeatTransfer_v0.x10 create mode 100644 samples/X10/HeatTransfer_v1.x10 create mode 100644 samples/X10/HelloWholeWorld.x10 create mode 100644 samples/X10/HelloWorld.x10 create mode 100644 samples/X10/Histogram.x10 create mode 100644 samples/X10/Integrate.x10 create mode 100644 samples/X10/KMeans.x10 create mode 100644 samples/X10/KMeansDist.x10 create mode 100644 samples/X10/KMeansDistPlh.x10 create mode 100644 samples/X10/KMeansSPMD.x10 create mode 100644 samples/X10/MontyPi.x10 create mode 100644 samples/X10/NQueensDist.x10 create mode 100644 samples/X10/NQueensPar.x10 create mode 100644 samples/X10/QSort.x10 create mode 100644 samples/X10/StructSpheres.x10 create mode 160000 vendor/grammars/X10 diff --git a/.gitmodules b/.gitmodules index 35cc9de8..5f07d011 100644 --- a/.gitmodules +++ b/.gitmodules @@ -674,3 +674,6 @@ [submodule "vendor/grammars/sublime-typescript"] path = vendor/grammars/sublime-typescript url = https://github.com/Microsoft/TypeScript-Sublime-Plugin +[submodule "vendor/grammars/X10"] + path = vendor/grammars/X10 + url = git@github.com:x10-lang/x10-highlighting.git diff --git a/grammars.yml b/grammars.yml index ae9ff92c..42be3967 100644 --- a/grammars.yml +++ b/grammars.yml @@ -144,6 +144,8 @@ vendor/grammars/VBDotNetSyntax: - source.vbnet vendor/grammars/Vala-TMBundle: - source.vala +vendor/grammars/X10: +- source.x10 vendor/grammars/abap.tmbundle: - source.abap vendor/grammars/actionscript3-tmbundle: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 5b31ed4f..311c8d79 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3567,6 +3567,16 @@ WebIDL: tm_scope: source.webidl ace_mode: text +X10: + type: programming + aliases: + - xten + ace_mode: text + extensions: + - .x10 + color: "#4B6BEF" + tm_scope: source.x10 + XC: type: programming color: "#99DA07" diff --git a/samples/X10/ArraySum.x10 b/samples/X10/ArraySum.x10 new file mode 100644 index 00000000..389d0e87 --- /dev/null +++ b/samples/X10/ArraySum.x10 @@ -0,0 +1,72 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.io.Console; + +/** + * A simple illustration of loop parallelization within a single place. + */ +public class ArraySum { + + var sum:Long; + val data:Rail[Long]; + + public def this(n:Long) { + // Create a Rail with n elements (0..(n-1)), all initialized to 1. + data = new Rail[Long](n, 1); + sum = 0; + } + + def sum(a:Rail[Long], start:Long, last:Long) { + var mySum: Long = 0; + for (i in start..(last-1)) { + mySum += a(i); + } + return mySum; + } + + def sum(numThreads:Long) { + val mySize = data.size/numThreads; + finish for (p in 0..(numThreads-1)) async { + val mySum = sum(data, p*mySize, (p+1)*mySize); + // Multiple activities will simultaneously update + // this location -- so use an atomic operation. + atomic sum += mySum; + } + } + + public static def main(args:Rail[String]) { + var size:Long = 5*1000*1000; + if (args.size >=1) + size = Long.parse(args(0)); + + Console.OUT.println("Initializing."); + val a = new ArraySum(size); + val P = [1,2,4]; + + //warmup loop + Console.OUT.println("Warming up."); + for (numThreads in P) + a.sum(numThreads); + + for (numThreads in P) { + Console.OUT.println("Starting with " + numThreads + " threads."); + a.sum=0; + var time: long = - System.nanoTime(); + a.sum(numThreads); + time += System.nanoTime(); + Console.OUT.println("For p=" + numThreads + + " result: " + a.sum + + ((size==a.sum)? " ok" : " bad") + + " (time=" + (time/(1000*1000)) + " ms)"); + } + } +} diff --git a/samples/X10/Cancellation.x10 b/samples/X10/Cancellation.x10 new file mode 100644 index 00000000..1e13bea1 --- /dev/null +++ b/samples/X10/Cancellation.x10 @@ -0,0 +1,50 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.xrx.Runtime; + +/** + * Demonstrate how to instantiate the X10 runtime as an executor service + * submit jobs to the runtime, wait jobs to complete and cancel all jobs + * + * Compile with: x10c -O -EXECUTOR_MODE=true Cancellation.x10 + * Run with: X10_CANCELLABLE=true X10_NPLACES=4 x10 -DX10RT_IMPL=JavaSockets Cancellation + */ +class Cancellation { + static def job(id:Long, iterations:Long) = ()=>{ + at (Place.places().next(here)) async { + for (i in 1..iterations) { + finish for (p in Place.places()) { + at (p) async Console.OUT.println(here+" says hello (job " + id + ", iteration " + i + ")"); + } + Console.ERR.println(); + System.sleep(200); + } + } + }; + + public static def main(args:Rail[String]):void { + val w1 = Runtime.submit(job(1, 5)); + w1.await(); Console.ERR.println("Job 1 completed\n"); + val w2 = Runtime.submit(job(2, 1000)); + System.threadSleep(1000); + val c1 = Runtime.cancelAll(); + try { w2.await(); } catch (e:Exception) { Console.ERR.println("Job 2 aborted with exception " + e +"\n"); } + c1.await(); // waiting for cancellation to be processed + System.threadSleep(1000); + Runtime.submit(job(3, 1000)); + Runtime.submit(job(4, 1000)); + System.threadSleep(1000); + val c2 = Runtime.cancelAll(); + c2.await(); + Console.ERR.println("Goodbye\n"); + } +} diff --git a/samples/X10/Fibonacci.x10 b/samples/X10/Fibonacci.x10 new file mode 100644 index 00000000..fc1466f1 --- /dev/null +++ b/samples/X10/Fibonacci.x10 @@ -0,0 +1,52 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.io.Console; + +/** + * This is a small program to illustrate the use of + * async and finish in a + * prototypical recursive divide-and-conquer algorithm. + * It is obviously not intended to show a efficient way to + * compute Fibonacci numbers in X10.

+ * + * The heart of the example is the run method, + * which directly embodies the recursive definition of + *

+ *   fib(n) = fib(n-1)+fib(n-2);
+ * 
+ * by using an async to compute fib(n-1) while + * the current activity computes fib(n-2). A finish + * is used to ensure that both computations are complete before + * their results are added together to compute fib(n) + */ +public class Fibonacci { + + public static def fib(n:long) { + if (n<=2) return 1; + + val f1:long; + val f2:long; + finish { + async { f1 = fib(n-1); } + f2 = fib(n-2); + } + return f1 + f2; + } + + public static def main(args:Rail[String]) { + val n = (args.size > 0) ? Long.parse(args(0)) : 10; + Console.OUT.println("Computing fib("+n+")"); + val f = fib(n); + Console.OUT.println("fib("+n+") = "+f); + } +} + diff --git a/samples/X10/HeatTransfer_v0.x10 b/samples/X10/HeatTransfer_v0.x10 new file mode 100644 index 00000000..5546fae8 --- /dev/null +++ b/samples/X10/HeatTransfer_v0.x10 @@ -0,0 +1,86 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.array.*; +import x10.compiler.Foreach; +import x10.compiler.Inline; + + +/** + * This is a sample program illustrating how to use + * X10's array classes. It also illustrates the use + * of foreach to acheive intra-place parallelism. + * + * The program solves a set of 2D partial differential + * equations by iteratively applying a 5-point stencil + * operation until convergence is reached. + */ +public class HeatTransfer_v0 { + static val EPSILON = 1.0e-5; + + val N:Long; + val A:Array_2[Double]{self!=null}; + val Tmp:Array_2[Double]{self!=null}; + + public def this(size:Long) { + N = size; + A = new Array_2[Double](N+2, N+2); // zero-initialized N+2 * N+2 array of doubles + for (j in 1..N) A(0, j) = 1; // set one border row to 1 + Tmp = new Array_2[Double](A); + } + + final @Inline def stencil(x:Long, y:Long):Double { + return (A(x-1,y) + A(x+1,y) + A(x,y-1) + A(x,y+1)) / 4; + } + + def run() { + val is = new DenseIterationSpace_2(1,1,N,N); + var delta:Double; + do { + // Compute new values, storing in tmp + delta = Foreach.blockReduce(is, + (i:Long, j:Long)=>{ + Tmp(i,j) = stencil(i,j); + // Reduce max element-wise delta (A now holds previous values) + return Math.abs(Tmp(i,j) - A(i,j)); + }, + (a:Double, b:Double)=>Math.max(a,b), 0.0 + ); + + // swap backing data of A and Tmp + Array.swap(A, Tmp); + } while (delta > EPSILON); + } + + def prettyPrintResult() { + for (i in 1..N) { + for (j in 1..N) { + Console.OUT.printf("%1.4f ",A(i,j)); + } + Console.OUT.println(); + } + } + + public static def main(args:Rail[String]) { + val n = args.size > 0 ? Long.parse(args(0)) : 8; + Console.OUT.println("HeatTransfer example with N="+n+" and epsilon="+EPSILON); + Console.OUT.println("Initializing data structures"); + val ht = new HeatTransfer_v0(n); + Console.OUT.println("Beginning computation..."); + val start = System.nanoTime(); + ht.run(); + val stop = System.nanoTime(); + Console.OUT.printf("...completed in %1.3f seconds.\n", ((stop-start) as double)/1e9); + if (n <= 10) { + ht.prettyPrintResult(); + } + } +} diff --git a/samples/X10/HeatTransfer_v1.x10 b/samples/X10/HeatTransfer_v1.x10 new file mode 100644 index 00000000..feeeebe6 --- /dev/null +++ b/samples/X10/HeatTransfer_v1.x10 @@ -0,0 +1,114 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.array.*; +import x10.compiler.Foreach; +import x10.util.Team; + +/** + * This is a sample program illustrating how to use + * X10's distributed array classes. It also illustrates the use + * of foreach to achieve intra-place parallelism and the mixture + * of APGAS finish/async/at with Team collective operations. + * + * This version of the program uses a vanilla DistArray without + * ghost regions. As a result, the stencil function does + * inefficient fine-grained neighbor communication to get individual values. + * Compare this to HeatTransfer_v2 which utilizes ghost regions and + * bulk ghost-region exchange functions. + * + * The program solves a set of 2D partial differential + * equations by iteratively applying a 5-point stencil + * operation until convergence is reached. + */ +public class HeatTransfer_v1 { + static val EPSILON = 1.0e-5; + + val N:Long; + val A:DistArray_BlockBlock_2[Double]{self!=null}; + val Tmp:DistArray_BlockBlock_2[Double]{self!=null}; + + public def this(size:Long) { + N = size; + val init = (i:Long, j:Long)=>i==0 ? 1.0 : 0.0; + A = new DistArray_BlockBlock_2[Double](N+2, N+2, init); + Tmp = new DistArray_BlockBlock_2[Double](N+2, N+2, init); + } + + final def stencil(x:Long, y:Long):Double { + val cls = (dx:Long, dy:Long)=>{ + val p = A.place(x+dx, y+dy); + p == here ? A(x+dx,y+dy) : at (p) A(x+dx,y+dy) + }; + val tmp = cls(-1,0) + cls(1,0) + cls(0,-1) + cls(0,1); + return tmp / 4; + } + + def run() { + val myTeam = new Team(A.placeGroup()); + finish for (p in A.placeGroup()) at (p) async { + // Compute the subset of the local indices on which + // we want to apply the stencil (the interior points of the N+2 x N+2 grid) + val li = A.localIndices(); + val interior = new DenseIterationSpace_2(li.min(0) == 0 ? 1 : li.min(0), + li.min(1) == 0 ? 1 : li.min(1), + li.max(0) == N+1 ? N : li.max(0), + li.max(1) == N+1 ? N : li.max(1)); + var delta:Double; + do { + // Compute new values, storing in tmp + val myDelta = Foreach.blockReduce(interior, + (i:Long, j:Long)=>{ + Tmp(i,j) = stencil(i,j); + // Reduce max element-wise delta (A now holds previous values) + return Math.abs(Tmp(i,j) - A(i,j)); + }, + (a:Double, b:Double)=>Math.max(a,b), 0.0 + ); + + myTeam.barrier(); + + // Unlike Array, DistArray doesn't provide an optimized swap. + // So, until it does, we have to copy the data elements. + Foreach.block(interior, (i:Long, j:Long)=>{ + A(i,j) = Tmp(i,j); + }); + + delta = myTeam.allreduce(myDelta, Team.MAX); + } while (delta > EPSILON); + } + } + + def prettyPrintResult() { + for (i in 1..N) { + for (j in 1..N) { + val x = at (A.place(i,j)) A(i,j); + Console.OUT.printf("%1.4f ", x); + } + Console.OUT.println(); + } + } + + public static def main(args:Rail[String]) { + val n = args.size > 0 ? Long.parse(args(0)) : 8; + Console.OUT.println("HeatTransfer example with N="+n+" and epsilon="+EPSILON); + Console.OUT.println("Initializing data structures"); + val ht = new HeatTransfer_v1(n); + Console.OUT.println("Beginning computation..."); + val start = System.nanoTime(); + ht.run(); + val stop = System.nanoTime(); + Console.OUT.printf("...completed in %1.3f seconds.\n", ((stop-start) as double)/1e9); + if (n <= 10) { + ht.prettyPrintResult(); + } + } +} diff --git a/samples/X10/HelloWholeWorld.x10 b/samples/X10/HelloWholeWorld.x10 new file mode 100644 index 00000000..4017ef9d --- /dev/null +++ b/samples/X10/HelloWholeWorld.x10 @@ -0,0 +1,44 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.io.Console; + +/** + * The classic hello world program, with a twist - prints a message + * from the command line at every Place. + * The messages from each Place may appear in any order, but the + * finish ensures that the last message printed will be "Goodbye" + *
+ * Typical output:
+ * [dgrove@linchen samples]$ ./HelloWholeWorld 'best wishes'
+ * Place(1) says hello and best wishes
+ * Place(2) says hello and best wishes
+ * Place(3) says hello and best wishes
+ * Place(0) says hello and best wishes
+ * Goodbye 
+ * [dgrove@linchen samples]$
+ * 
+ */ +class HelloWholeWorld { + public static def main(args:Rail[String]):void { + if (args.size < 1) { + Console.OUT.println("Usage: HelloWholeWorld message"); + return; + } + + finish for (p in Place.places()) { + at (p) async Console.OUT.println(here+" says hello and "+args(0)); + } + Console.OUT.println("Goodbye"); + } +} + + diff --git a/samples/X10/HelloWorld.x10 b/samples/X10/HelloWorld.x10 new file mode 100644 index 00000000..06743b4c --- /dev/null +++ b/samples/X10/HelloWorld.x10 @@ -0,0 +1,23 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.io.Console; + +/** + * The classic hello world program, shows how to output to the console. + */ +class HelloWorld { + public static def main(Rail[String]) { + Console.OUT.println("Hello World!" ); + } +} + + diff --git a/samples/X10/Histogram.x10 b/samples/X10/Histogram.x10 new file mode 100644 index 00000000..bf6ad2b1 --- /dev/null +++ b/samples/X10/Histogram.x10 @@ -0,0 +1,45 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +public class Histogram { + public static def compute(data:Rail[Int], numBins:Int) { + val bins = new Rail[Int](numBins); + finish for (i in data.range) async { + val b = data(i) % numBins; + atomic bins(b)++; + } + return bins; + } + + public static def run(N:Int, S:Int):Boolean { + val a = new Rail[Int](N, (i:long)=> i as int); + val b = compute(a, S); + val v = b(0); + var ok:Boolean = true; + for (x in b.range) ok &= (b(x)==v); + return ok; + } + + public static def main(args:Rail[String]) { + if (args.size != 2L) { + Console.OUT.println("Usage: Histogram SizeOfArray NumberOfBins"); + return; + } + val N = Int.parse(args(0)); + val S = Int.parse(args(1)); + val ok = run(N,S); + if (ok) { + Console.OUT.println("Test ok."); + } else { + Console.OUT.println("Test failed."); + } + } +} diff --git a/samples/X10/Integrate.x10 b/samples/X10/Integrate.x10 new file mode 100644 index 00000000..accf31b9 --- /dev/null +++ b/samples/X10/Integrate.x10 @@ -0,0 +1,55 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +/** + * This is a slightly more realistic example of the + * basic computational pattern of using async/finish + * to express recursive divide-and-conquer algorithms. + * The program does integration via Guassian Quadrature. + *

+ * It also can serve as an example of using a closure. + */ +public class Integrate { + static val epsilon = 1.0e-9; + + val fun:(double)=>double; + + public def this(f:(double)=>double) { fun = f; } + + public def computeArea(left:double, right:double) { + return recEval(left, fun(left), right, fun(right), 0); + } + + private def recEval(l:double, fl:double, r:double, fr:double, a:double) { + val h = (r - l) / 2; + val hh = h / 2; + val c = l + h; + val fc = fun(c); + val al = (fl + fc) * hh; + val ar = (fr + fc) * hh; + val alr = al + ar; + if (Math.abs(alr - a) < epsilon) return alr; + val expr1:double; + val expr2:double; + finish { + async { expr1 = recEval(c, fc, r, fr, ar); }; + expr2 = recEval(l, fl, c, fc, al); + } + return expr1 + expr2; + } + + public static def main(args:Rail[String]) { + val obj = new Integrate((x:double)=>(x*x + 1.0) * x); + val xMax = args.size > 0 ? Long.parse(args(0)) : 10; + val area = obj.computeArea(0, xMax); + Console.OUT.println("The area of (x*x +1) * x from 0 to "+xMax+" is "+area); + } +} diff --git a/samples/X10/KMeans.x10 b/samples/X10/KMeans.x10 new file mode 100644 index 00000000..475732b7 --- /dev/null +++ b/samples/X10/KMeans.x10 @@ -0,0 +1,151 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.io.Console; +import x10.util.Random; + +/** + * A KMeans object o can compute K means of a given set of + * points of dimension o.myDim. + *

+ * This class implements a sequential program, that is readily parallelizable. + * + * For a scalable, high-performance version of this benchmark see + * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org) + */ +public class KMeans(myDim:Long) { + + static val DIM=2; + static val K=4; + static val POINTS=2000; + static val ITERATIONS=50; + static val EPS=0.01F; + + static type ValVector(k:Long) = Rail[Float]{self.size==k}; + static type ValVector = ValVector(DIM); + + static type Vector(k:Long) = Rail[Float]{self.size==k}; + static type Vector = Vector(DIM); + + static type SumVector(d:Long) = V{self.dim==d}; + static type SumVector = SumVector(DIM); + + /** + * V represents the sum of 'count' number of vectors of dimension 'dim'. + */ + static class V(dim:Long) implements (Long)=>Float { + var vec: Vector(dim); + var count:Int; + def this(dim:Long, init:(Long)=>Float): SumVector(dim) { + property(dim); + vec = new Rail[Float](this.dim, init); + count = 0n; + } + public operator this(i:Long) = vec(i); + def makeZero() { + for (i in 0..(dim-1)) + vec(i) =0.0F; + count=0n; + } + def addIn(a:ValVector(dim)) { + for (i in 0..(dim-1)) + vec(i) += a(i); + count++; + } + def div(f:Int) { + for (i in 0..(dim-1)) + vec(i) /= f; + } + def dist(a:ValVector(dim)):Float { + var dist:Float=0.0F; + for (i in 0..(dim-1)) { + val tmp = vec(i)-a(i); + dist += tmp*tmp; + } + return dist; + } + def dist(a:SumVector(dim)):Float { + var dist:Float=0.0F; + for (i in 0..(dim-1)) { + val tmp = vec(i)-a(i); + dist += tmp*tmp; + } + return dist; + } + def print() { + Console.OUT.println(); + for (i in 0..(dim-1)) { + Console.OUT.print((i>0? " " : "") + vec(i)); + } + } + def normalize() { div(count);} + def count() = count; + } + + + def this(myDim:Long):KMeans{self.myDim==myDim} { + property(myDim); + } + static type KMeansData(myK:Long, myDim:Long)= Rail[SumVector(myDim)]{self.size==myK}; + + /** + * Compute myK means for the given set of points of dimension myDim. + */ + def computeMeans(myK:Long, points:Rail[ValVector(myDim)]):KMeansData(myK, myDim) { + var redCluster : KMeansData(myK, myDim) = + new Rail[SumVector(myDim)](myK, (i:long)=> new V(myDim, (j:long)=>points(i)(j))); + var blackCluster: KMeansData(myK, myDim) = + new Rail[SumVector(myDim)](myK, (i:long)=> new V(myDim, (j:long)=>0.0F)); + for (i in 1..ITERATIONS) { + val tmp = redCluster; + redCluster = blackCluster; + blackCluster=tmp; + for (p in 0..(POINTS-1)) { + var closest:Long = -1; + var closestDist:Float = Float.MAX_VALUE; + val point = points(p); + for (k in 0..(myK-1)) { // compute closest mean in cluster. + val dist = blackCluster(k).dist(point); + if (dist < closestDist) { + closestDist = dist; + closest = k; + } + } + redCluster(closest).addIn(point); + } + for (k in 0..(myK-1)) + redCluster(k).normalize(); + + var b:Boolean = true; + for (k in 0..(myK-1)) { + if (redCluster(k).dist(blackCluster(k)) > EPS) { + b=false; + break; + } + } + if (b) + break; + for (k in 0..(myK-1)) + blackCluster(k).makeZero(); + } + return redCluster; + } + + public static def main (Rail[String]) { + val rnd = new Random(0); + val points = new Rail[ValVector](POINTS, + (long)=>new Rail[Float](DIM, (long)=>rnd.nextFloat())); + val result = new KMeans(DIM).computeMeans(K, points); + for (k in 0..(K-1)) result(k).print(); + } +} + +// vim: shiftwidth=4:tabstop=4:expandtab diff --git a/samples/X10/KMeansDist.x10 b/samples/X10/KMeansDist.x10 new file mode 100644 index 00000000..069cc374 --- /dev/null +++ b/samples/X10/KMeansDist.x10 @@ -0,0 +1,147 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.array.*; +import x10.io.Console; +import x10.util.Random; + +/** + * A low performance formulation of distributed KMeans using fine-grained asyncs. + * + * For a highly optimized and scalable, version of this benchmark see + * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org) + */ +public class KMeansDist { + + static val DIM=2; + static val CLUSTERS=4; + static val POINTS=2000; + static val ITERATIONS=50; + + public static def main (Rail[String]) { + val world = Place.places(); + val local_curr_clusters = + PlaceLocalHandle.make[Array_2[Float]](world, () => new Array_2[Float](CLUSTERS, DIM)); + val local_new_clusters = + PlaceLocalHandle.make[Array_2[Float]](world, () => new Array_2[Float](CLUSTERS, DIM)); + val local_cluster_counts = + PlaceLocalHandle.make[Rail[Int]](world, ()=> new Rail[Int](CLUSTERS)); + + val rnd = PlaceLocalHandle.make[Random](world, () => new Random(0)); + val points = new DistArray_Block_2[Float](POINTS, DIM, world, (Long,Long)=>rnd().nextFloat()); + + val central_clusters = new Array_2[Float](CLUSTERS, DIM, (i:Long, j:Long) => { + at (points.place(i,j)) points(i,j) + }); + + val old_central_clusters = new Array_2[Float](CLUSTERS, DIM); + + val central_cluster_counts = new Rail[Int](CLUSTERS); + + for (iter in 1..ITERATIONS) { + + Console.OUT.println("Iteration: "+iter); + + finish { + // reset state + for (d in world) at (d) async { + for ([i,j] in central_clusters.indices()) { + local_curr_clusters()(i, j) = central_clusters(i, j); + local_new_clusters()(i, j) = 0f; + } + + local_cluster_counts().clear(); + } + } + + finish { + // compute new clusters and counters + for (p in 0..(POINTS-1)) { + at (points.place(p,0)) async { + var closest:Long = -1; + var closest_dist:Float = Float.MAX_VALUE; + for (k in 0..(CLUSTERS-1)) { + var dist : Float = 0; + for (d in 0..(DIM-1)) { + val tmp = points(p,d) - local_curr_clusters()(k, d); + dist += tmp * tmp; + } + if (dist < closest_dist) { + closest_dist = dist; + closest = k; + } + } + atomic { + for (d in 0..(DIM-1)) { + local_new_clusters()(closest,d) += points(p,d); + } + local_cluster_counts()(closest)++; + } + } + } + } + + for ([i,j] in old_central_clusters.indices()) { + old_central_clusters(i, j) = central_clusters(i, j); + central_clusters(i, j) = 0f; + } + + central_cluster_counts.clear(); + + finish { + val central_clusters_gr = GlobalRef(central_clusters); + val central_cluster_counts_gr = GlobalRef(central_cluster_counts); + val there = here; + for (d in world) at (d) async { + // access PlaceLocalHandles 'here' and then data will be captured by at and transfered to 'there' for accumulation + val tmp_new_clusters = local_new_clusters(); + val tmp_cluster_counts = local_cluster_counts(); + at (there) atomic { + for ([i,j] in tmp_new_clusters.indices()) { + central_clusters_gr()(i,j) += tmp_new_clusters(i,j); + } + for (j in 0..(CLUSTERS-1)) { + central_cluster_counts_gr()(j) += tmp_cluster_counts(j); + } + } + } + } + + for (k in 0..(CLUSTERS-1)) { + for (d in 0..(DIM-1)) { + central_clusters(k, d) /= central_cluster_counts(k); + } + } + + // TEST FOR CONVERGENCE + var b:Boolean = true; + for ([i,j] in old_central_clusters.indices()) { + if (Math.abs(old_central_clusters(i, j)-central_clusters(i, j))>0.0001) { + b = false; + break; + } + } + if (b) break; + + } + + for (d in 0..(DIM-1)) { + for (k in 0..(CLUSTERS-1)) { + if (k>0) + Console.OUT.print(" "); + Console.OUT.print(central_clusters(k,d)); + } + Console.OUT.println(); + } + } +} + +// vim: shiftwidth=4:tabstop=4:expandtab diff --git a/samples/X10/KMeansDistPlh.x10 b/samples/X10/KMeansDistPlh.x10 new file mode 100644 index 00000000..ca16aa59 --- /dev/null +++ b/samples/X10/KMeansDistPlh.x10 @@ -0,0 +1,144 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2015. + */ + +import x10.array.Array; +import x10.array.Array_2; +import x10.compiler.Foreach; +import x10.util.Random; + +/** + * A better formulation of distributed KMeans using coarse-grained asyncs to + * implement an allreduce pattern for cluster centers and counts. + * + * For a highly optimized and scalable, version of this benchmark see + * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org) + */ +public class KMeansDistPlh { + + static val DIM=2; + static val CLUSTERS=4; + + static class ClusterState { + val clusters = new Array_2[Float](CLUSTERS, DIM); + val clusterCounts = new Rail[Int](CLUSTERS); + } + + public static def main(args:Rail[String]) { + val numPoints = args.size > 0 ? Long.parse(args(0)) : 2000; + val iterations = args.size > 1 ? Long.parse(args(1)) : 50; + val world = Place.places(); + + val clusterStatePlh = PlaceLocalHandle.make[ClusterState](world, () => new ClusterState()); + val currentClustersPlh = PlaceLocalHandle.make[Array_2[Float]](world, () => new Array_2[Float](CLUSTERS, DIM)); + val pointsPlh = PlaceLocalHandle.make[Array_2[Float]](world, () => { + val rand = new Random(here.id); + return new Array_2[Float](numPoints/world.size(), DIM, (Long,Long)=>rand.nextFloat()); + }); + + val centralCurrentClusters = new Array_2[Float](CLUSTERS, DIM); + val centralNewClusters = new Array_2[Float](CLUSTERS, DIM); + val centralClusterCounts = new Rail[Int](CLUSTERS); + + // arbitrarily initialize central clusters to first few points + for ([i,j] in centralCurrentClusters.indices()) { + centralCurrentClusters(i,j) = pointsPlh()(i,j); + } + + for (iter in 1..iterations) { + Console.OUT.println("Iteration: "+iter); + + finish { + for (place in world) async { + val placeClusters = at(place) { + val currentClusters = currentClustersPlh(); + Array.copy(centralCurrentClusters, currentClusters); + + val clusterState = clusterStatePlh(); + val newClusters = clusterState.clusters; + newClusters.clear(); + val clusterCounts = clusterState.clusterCounts; + clusterCounts.clear(); + + // compute new clusters and counters + val points = pointsPlh(); + + for (p in 0..(points.numElems_1-1)) { + var closest:Long = -1; + var closestDist:Float = Float.MAX_VALUE; + for (k in 0..(CLUSTERS-1)) { + var dist : Float = 0; + for (d in 0..(DIM-1)) { + val tmp = points(p,d) - currentClusters(k, d); + dist += tmp * tmp; + } + if (dist < closestDist) { + closestDist = dist; + closest = k; + } + } + + atomic { + for (d in 0..(DIM-1)) { + newClusters(closest,d) += points(p,d); + } + clusterCounts(closest)++; + } + } + clusterState + }; + + // combine place clusters to central + atomic { + for ([i,j] in centralNewClusters.indices()) { + centralNewClusters(i,j) += placeClusters.clusters(i,j); + } + for (j in 0..(CLUSTERS-1)) { + centralClusterCounts(j) += placeClusters.clusterCounts(j); + } + } + } + } + + for (k in 0..(CLUSTERS-1)) { + for (d in 0..(DIM-1)) { + centralNewClusters(k, d) /= centralClusterCounts(k); + } + } + + // TEST FOR CONVERGENCE + var b:Boolean = true; + for ([i,j] in centralCurrentClusters.indices()) { + if (Math.abs(centralCurrentClusters(i, j)-centralNewClusters(i, j)) > 0.0001) { + b = false; + break; + } + } + + Array.copy(centralNewClusters, centralCurrentClusters); + + if (b) break; + + centralNewClusters.clear(); + centralClusterCounts.clear(); + } + + for (d in 0..(DIM-1)) { + for (k in 0..(CLUSTERS-1)) { + if (k > 0) + Console.OUT.print(" "); + Console.OUT.print(centralCurrentClusters(k,d)); + } + Console.OUT.println(); + } + } +} + +// vim: shiftwidth=4:tabstop=4:expandtab diff --git a/samples/X10/KMeansSPMD.x10 b/samples/X10/KMeansSPMD.x10 new file mode 100644 index 00000000..f6530f24 --- /dev/null +++ b/samples/X10/KMeansSPMD.x10 @@ -0,0 +1,192 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.io.Console; +import x10.io.File; +import x10.io.Marshal; +import x10.io.IOException; +import x10.util.OptionsParser; +import x10.util.Option; +import x10.util.Team; + +/** + * An SPMD formulation of KMeans. + * + * For a highly optimized and scalable version of this benchmark see + * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org) + */ +public class KMeansSPMD { + + public static def printClusters (clusters:Rail[Float], dims:long) { + for (d in 0..(dims-1)) { + for (k in 0..(clusters.size/dims-1)) { + if (k>0) + Console.OUT.print(" "); + Console.OUT.print(clusters(k*dims+d).toString()); + } + Console.OUT.println(); + } + } + + public static def main (args:Rail[String]) {here == Place.FIRST_PLACE } { + + val opts = new OptionsParser(args, [ + Option("q","quiet","just print time taken"), + Option("v","verbose","print out each iteration"), + Option("h","help","this information") + ], [ + Option("p","points","location of data file"), + Option("i","iterations","quit after this many iterations"), + Option("c","clusters","number of clusters to find"), + Option("d","dim","number of dimensions"), + Option("s","slices","factor by which to oversubscribe computational resources"), + Option("n","num","quantity of points") + ]); + if (opts.filteredArgs().size!=0L) { + Console.ERR.println("Unexpected arguments: "+opts.filteredArgs()); + Console.ERR.println("Use -h or --help."); + System.setExitCode(1n); + return; + } + if (opts("-h")) { + Console.OUT.println(opts.usage("")); + return; + } + + val fname = opts("-p", "points.dat"); + val num_clusters=opts("-c",4); + val num_slices=opts("-s",1); + val num_global_points=opts("-n", 2000); + val iterations=opts("-i",50); + val dim=opts("-d", 4); + val verbose = opts("-v"); + val quiet = opts("-q"); + + if (!quiet) + Console.OUT.println("points: "+num_global_points+" clusters: "+num_clusters+" dim: "+dim); + + // file is dimension-major + val file = new File(fname); + val fr = file.openRead(); + val init_points = (long) => Float.fromIntBits(Marshal.INT.read(fr).reverseBytes()); + val num_file_points = (file.size() / dim / 4) as Int; + val file_points = new Rail[Float](num_file_points*dim, init_points); + + val team = Team.WORLD; + + val num_slice_points = num_global_points / num_slices / Place.numPlaces(); + + finish { + for (h in Place.places()) at(h) async { + var compute_time:Long = 0; + var comm_time:Long = 0; + var barrier_time:Long = 0; + + val host_clusters = new Rail[Float](num_clusters*dim, (i:long)=>file_points(i)); + val host_cluster_counts = new Rail[Int](num_clusters); + + for (slice in 0..(num_slices-1)) { + // carve out local portion of points (point-major) + val offset = (slice*Place.numPlaces() + here.id) * num_slice_points; + if (verbose) + Console.OUT.println(h.toString()+" gets "+offset+" len "+num_slice_points); + val init = (i:long) => { + val p=i%num_slice_points; + val d=i/num_slice_points; + return file_points(offset+p+d*num_file_points); + }; + + // these are pretty big so allocate up front + val host_points = new Rail[Float](num_slice_points*dim, init); + val host_nearest = new Rail[Float](num_slice_points); + + val start_time = System.currentTimeMillis(); + + barrier_time -= System.nanoTime(); + team.barrier(); + barrier_time += System.nanoTime(); + + main_loop: for (iter in 0..(iterations-1)) { + + //if (offset==0) Console.OUT.println("Iteration: "+iter); + + val old_clusters = new Rail[Float](host_clusters.size); + Rail.copy(host_clusters, 0L, old_clusters, 0L, host_clusters.size); + + host_clusters.clear(); + host_cluster_counts.clear(); + + compute_time -= System.nanoTime(); + for (p in 0..(num_slice_points-1)) { + var closest:Long = -1; + var closest_dist:Float = Float.MAX_VALUE; + for (k in 0..(num_clusters-1)) { + var dist : Float = 0; + for (d in 0..(dim-1)) { + val tmp = host_points(p+d*num_slice_points) - old_clusters(k*dim+d); + dist += tmp * tmp; + } + if (dist < closest_dist) { + closest_dist = dist; + closest = k; + } + } + for (d in 0..(dim-1)) { + host_clusters(closest*dim+d) += host_points(p+d*num_slice_points); + } + host_cluster_counts(closest)++; + } + compute_time += System.nanoTime(); + + comm_time -= System.nanoTime(); + team.allreduce(host_clusters, 0L, host_clusters, 0L, host_clusters.size, Team.ADD); + team.allreduce(host_cluster_counts, 0L, host_cluster_counts, 0L, host_cluster_counts.size, Team.ADD); + comm_time += System.nanoTime(); + + for (k in 0..(num_clusters-1)) { + for (d in 0..(dim-1)) host_clusters(k*dim+d) /= host_cluster_counts(k); + } + + if (offset==0 && verbose) { + Console.OUT.println("Iteration: "+iter); + printClusters(host_clusters,dim); + } + + // TEST FOR CONVERGENCE + for (j in 0..(num_clusters*dim-1)) { + if (true/*||Math.abs(clusters_old(j)-host_clusters(j))>0.0001*/) continue main_loop; + } + + break; + + } // main_loop + + } // slice + + Console.OUT.printf("%d: computation %.3f s communication %.3f s (barrier %.3f s)\n", + here.id, compute_time/1E9, comm_time/1E9, barrier_time/1E9); + + team.barrier(); + + if (here.id == 0) { + Console.OUT.println("\nFinal results:"); + printClusters(host_clusters,dim); + } + + } // async + + } // finish + + } + +} + +// vim: shiftwidth=4:tabstop=4:expandtab diff --git a/samples/X10/MontyPi.x10 b/samples/X10/MontyPi.x10 new file mode 100644 index 00000000..951161ee --- /dev/null +++ b/samples/X10/MontyPi.x10 @@ -0,0 +1,42 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.array.DistArray_Unique; +import x10.io.Console; +import x10.util.Random; + +/** + * Calculation of an approximation to pi by using a Monte Carlo simulation + * (throwing darts into the unit square and determining the fraction that land + * in the unit circle). + */ +public class MontyPi { + public static def main(args:Rail[String]) { + if (args.size != 1L) { + Console.OUT.println("Usage: MontyPi "); + return; + } + val N = Long.parse(args(0)); + val initializer = () => { + val r = new Random(); + var result:Long = 0; + for(c in 1..N) { + val x = r.nextDouble(); + val y = r.nextDouble(); + if (x*x +y*y <= 1.0) result++; + } + result + }; + val result = new DistArray_Unique[Long](Place.places(), initializer); + val pi = (4.0*result.reduce((x:Long,y:Long) => x+y, 0) as Double)/(N*Place.numPlaces()); + Console.OUT.println("The value of pi is " + pi); + } +} diff --git a/samples/X10/NQueensDist.x10 b/samples/X10/NQueensDist.x10 new file mode 100644 index 00000000..1279d3ff --- /dev/null +++ b/samples/X10/NQueensDist.x10 @@ -0,0 +1,123 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + * (C) Copyright Australian National University 2011. + */ + +import x10.array.DistArray_Unique; + +/** + * A distributed version of NQueens. Runs over NUM_PLACES. + * Identical to NQueensPar, except that work is distributed + * over multiple places rather than shared between threads. + */ +public class NQueensDist { + public static val EXPECTED_SOLUTIONS = + [0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512]; + + val N:Long; + val P:Long; + val results:DistArray_Unique[Long]; + val R:LongRange; + + def this(N:Long, P:Long) { + this.N=N; + this.P=P; + this.results = new DistArray_Unique[Long](); + this.R = 0..(N-1); + } + def start() { + new Board().distSearch(); + } + def run():Long { + finish start(); + val result = results.reduce(((x:Long,y:Long) => x+y),0); + return result; + } + + class Board { + val q: Rail[Long]; + /** The number of low-rank positions that are fixed in this board for the purposes of search. */ + var fixed:Long; + def this() { + q = new Rail[Long](N); + fixed = 0; + } + + /** + * @return true if it is safe to put a queen in file j + * on the next rank after the last fixed position. + */ + def safe(j:Long) { + for (k in 0..(fixed-1)) { + if (j == q(k) || Math.abs(fixed-k) == Math.abs(j-q(k))) + return false; + } + return true; + } + + /** Search all positions for the current board. */ + def search() { + for (k in R) searchOne(k); + } + + /** + * Modify the current board by adding a new queen + * in file k on rank fixed, + * and search for all safe positions with this prefix. + */ + def searchOne(k:Long) { + if (safe(k)) { + if (fixed==(N-1)) { + // all ranks safely filled + atomic NQueensDist.this.results(here.id)++; + } else { + q(fixed++) = k; + search(); + fixed--; + } + } + } + + /** + * Search this board, dividing the work between all places + * using a block distribution of the current free rank. + */ + def distSearch() { + val work = R.split(Place.numPlaces()); + finish for (p in Place.places()) { + val myPiece = work(p.id); + at (p) async { + // implicit copy of 'this' made across the at divide + for (k in myPiece) { + searchOne(k); + } + } + } + } + } + + public static def main(args:Rail[String]) { + val n = args.size > 0 ? Long.parse(args(0)) : 8; + Console.OUT.println("N=" + n); + //warmup + //finish new NQueensPar(12, 1).start(); + val P = Place.numPlaces(); + val nq = new NQueensDist(n,P); + var start:Long = -System.nanoTime(); + val answer = nq.run(); + val result = answer==EXPECTED_SOLUTIONS(n); + start += System.nanoTime(); + start /= 1000000; + Console.OUT.println("NQueensDist " + nq.N + "(P=" + P + + ") has " + answer + " solutions" + + (result? " (ok)." : " (wrong).") + + "time=" + start + "ms"); + } +} diff --git a/samples/X10/NQueensPar.x10 b/samples/X10/NQueensPar.x10 new file mode 100644 index 00000000..bb841e13 --- /dev/null +++ b/samples/X10/NQueensPar.x10 @@ -0,0 +1,117 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + * (C) Copyright Australian National University 2011. + */ + +/** + * Compute the number of solutions to the N queens problem. + */ +public class NQueensPar { + public static val EXPECTED_SOLUTIONS = + [0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512]; + + val N:Int; + val P:Int; + var nSolutions:Int = 0n; + val R:IntRange; + + def this(N:Int, P:Int) { + this.N=N; + this.P=P; + this.R = 0n..(N-1n); + } + + def start() { + new Board().parSearch(); + } + + class Board { + val q: Rail[Int]; + /** The number of low-rank positions that are fixed in this board for the purposes of search. */ + var fixed:Int; + def this() { + q = new Rail[Int](N); + fixed = 0n; + } + + def this(b:Board) { + this.q = new Rail[Int](b.q); + this.fixed = b.fixed; + } + + /** + * @return true if it is safe to put a queen in file j + * on the next rank after the last fixed position. + */ + def safe(j:Int) { + for (k in 0n..(fixed-1n)) { + if (j == q(k) || Math.abs(fixed-k) == Math.abs(j-q(k))) + return false; + } + return true; + } + + /** Search all positions for the current board. */ + def search() { + for (k in R) searchOne(k); + } + + /** + * Modify the current board by adding a new queen + * in file k on rank fixed, + * and search for all safe positions with this prefix. + */ + def searchOne(k:Int) { + if (safe(k)) { + if (fixed==(N-1n)) { + // all ranks safely filled + atomic NQueensPar.this.nSolutions++; + } else { + q(fixed++) = k; + search(); + fixed--; + } + } + } + + /** + * Search this board, dividing the work between threads + * using a block distribution of the current free rank. + */ + def parSearch() { + for (work in R.split(P)) async { + val board = new Board(this); + for (w in work) { + board.searchOne(w); + } + } + } + } + + public static def main(args:Rail[String]) { + val n = args.size > 0 ? Int.parse(args(0)) : 8n; + Console.OUT.println("N=" + n); + //warmup + //finish new NQueensPar(12, 1).start(); + val ps = [1n,2n,4n]; + for (numTasks in ps) { + Console.OUT.println("starting " + numTasks + " tasks"); + val nq = new NQueensPar(n,numTasks); + var start:Long = -System.nanoTime(); + finish nq.start(); + val result = (nq.nSolutions as Long)==EXPECTED_SOLUTIONS(nq.N); + start += System.nanoTime(); + start /= 1000000; + Console.OUT.println("NQueensPar " + nq.N + "(P=" + numTasks + + ") has " + nq.nSolutions + " solutions" + + (result? " (ok)." : " (wrong).") + "time=" + start + "ms"); + } + } +} diff --git a/samples/X10/QSort.x10 b/samples/X10/QSort.x10 new file mode 100644 index 00000000..d96983b6 --- /dev/null +++ b/samples/X10/QSort.x10 @@ -0,0 +1,73 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + + +/** + * Straightforward quicksort implementation using + * naive partition-in-the-middle and not bothering with + * well-known optimizations such as using insertion sort + * once the partitions get small. This is only intended + * as a simple example of an array-based program that + * combines a recirsive divide and conquer algorithm + * with async and finish, not as a highly efficient + * sorting procedure.. + */ +public class QSort { + + private static def partition(data:Rail[int], left:long, right:long) { + var i:long = left; + var j:long = right; + var tmp:int; + var pivot:long = data((left + right) / 2); + + while (i <= j) { + while (data(i) < pivot) i++; + while (data(j) > pivot) j--; + if (i <= j) { + tmp = data(i); + data(i) = data(j); + data(j) = tmp; + i++; + j--; + } + } + + return i; + } + + public static def qsort(data:Rail[int], left:long, right:long) { + index:long = partition(data, left, right); + finish { + if (left < index - 1) + async qsort(data, left, index - 1); + + if (index < right) + qsort(data, index, right); + } + } + + public static def main(args:Rail[String]) { + val N = args.size>0 ? Long.parse(args(0)) : 100; + val r = new x10.util.Random(); + val data = new Rail[int](N, (long)=>r.nextInt(9999n)); + qsort(data, 0, N-1); + for (i in 0..(N-1)) { + Console.OUT.print(data(i)); + if (i%10 == 9) { + Console.OUT.println(); + } else { + Console.OUT.print(", "); + } + } + Console.OUT.println(); + } +} + diff --git a/samples/X10/StructSpheres.x10 b/samples/X10/StructSpheres.x10 new file mode 100644 index 00000000..6d833633 --- /dev/null +++ b/samples/X10/StructSpheres.x10 @@ -0,0 +1,123 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2014. + */ + +import x10.io.Console; +import x10.util.Random; + +/** + * This class represents a real-world problem in graphics engines -- + * determining which objects in a large sprawling world are close enough to the + * camera to be considered for rendering. + * + * It illustrates the usage of X10 structs to define new primitive types. + * In Native X10, structs are allocated within their containing object/stack frame + * and thus using structs instead of classes for Vector3 and WorldObject greatly + * improves the memory efficiency of the computation. + * + * @Author Dave Cunningham + * @Author Vijay Saraswat + */ +class StructSpheres { + static type Real = Float; + + static struct Vector3(x:Real, y:Real, z:Real) { + public def getX () = x; + public def getY () = y; + public def getZ () = z; + + public def add (other:Vector3) + = Vector3(this.x+other.x, this.y+other.y, this.z+other.z); + + public def neg () = Vector3(-this.x, -this.y, -this.z); + + public def sub (other:Vector3) = add(other.neg()); + + public def length () = Math.sqrtf(length2()); + + public def length2 () = x*x + y*y + z*z; + } + + + static struct WorldObject { + + def this (x:Real, y:Real, z:Real, r:Real) { + pos = Vector3(x,y,z); + renderingDistance = r; + } + + public def intersects (home:Vector3) + = home.sub(pos).length2() < renderingDistance*renderingDistance; + + protected val pos:Vector3; + protected val renderingDistance:Real; + } + + + public static def compute():boolean { + + val reps = 7500; + + // The following correspond to a modern out-door computer game: + val num_objects = 50000; + val world_size = 6000; + val obj_max_size = 400; + + val ran = new Random(0); + + // the array can go on the heap + // but the elements ought to be /*inlined*/ in the array + val spheres = + new Rail[WorldObject](num_objects, (i:long) => { + val x = (ran.nextDouble()*world_size) as Real; + val y = (ran.nextDouble()*world_size) as Real; + val z = (ran.nextDouble()*world_size) as Real; + val r = (ran.nextDouble()*obj_max_size) as Real; + return WorldObject(x,y,z,r); + }); + + val time_start = System.nanoTime(); + + var counter : Long = 0; + + // HOT LOOP BEGINS + for (c in 1..reps) { + + val x = (ran.nextDouble()*world_size) as Real; + val y = (ran.nextDouble()*world_size) as Real; + val z = (ran.nextDouble()*world_size) as Real; + + val pos = Vector3(x,y,z); + + for (i in spheres.range()) { + if (spheres(i).intersects(pos)) { + counter++; + } + } + } + // HOT LOOP ENDS + + val time_taken = System.nanoTime() - time_start; + Console.OUT.println("Total time: "+time_taken/1E9); + + val expected = 109702; + val ok = counter == expected; + if (!ok) { + Console.ERR.println("number of intersections: "+counter + +" (expected "+expected+")"); + } + return ok; + } + + public static def main (Rail[String]) { + compute(); + } + +} diff --git a/vendor/grammars/X10 b/vendor/grammars/X10 new file mode 160000 index 00000000..05fc5c81 --- /dev/null +++ b/vendor/grammars/X10 @@ -0,0 +1 @@ +Subproject commit 05fc5c81cc9491f5785e896c9a5f43a61fac9073 From a2ca88651082e7f2a65fa10be8c0c143d24e2d48 Mon Sep 17 00:00:00 2001 From: Jacob Bandes-Storch Date: Tue, 25 Aug 2015 23:19:09 -0700 Subject: [PATCH 014/227] Vendored definitions for Xcode-related files --- lib/linguist/vendor.yml | 5 +++++ test/test_blob.rb | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index ed89eda8..a984f520 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -164,6 +164,11 @@ ## Obj-C ## +# Xcode + +- \.xctemplate/ +- \.imageset/ + # Carthage - ^Carthage/ diff --git a/test/test_blob.rb b/test/test_blob.rb index 0a1cefe9..abce9934 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -492,6 +492,11 @@ class TestBlob < Minitest::Test # Crashlytics assert sample_blob("Crashlytics.framework/Crashlytics.h").vendored? + + # Xcode + assert sample_blob("myapp/My Template.xctemplate/___FILEBASENAME___.h").vendored? + assert sample_blob("myapp/My Images.xcassets/some/stuff.imageset/Contents.json").vendored? + assert !sample_blob("myapp/MyData.json").vendored? end def test_documentation From 0e9ded45dcd81498377566c0a505a389cedf0a86 Mon Sep 17 00:00:00 2001 From: Jacob Bandes-Storch Date: Wed, 26 Aug 2015 00:34:00 -0700 Subject: [PATCH 015/227] Fix typo in Obj-C heuristic keyword MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `synchronised` → `synchronized` --- lib/linguist/heuristics.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 7c523fa8..4d468bf0 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -65,7 +65,7 @@ module Linguist end # Common heuristics - ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/ + ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronized|selector|implementation)\b/ disambiguate ".bb" do |data| if /^\s*; /.match(data) || data.include?("End Function") From c9e43804d6723bddc01f5d914e6c328eac5cd03f Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Wed, 26 Aug 2015 09:26:04 -0400 Subject: [PATCH 016/227] add some help text to license test --- test/test_grammars.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/test_grammars.rb b/test/test_grammars.rb index 65a7e6de..82086db9 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -83,12 +83,16 @@ class TestGrammars < Minitest::Test def test_submodules_have_recognized_licenses unrecognized = submodule_licenses.select { |k,v| v.nil? && Licensee::Project.new(k).license_file } unrecognized.reject! { |k,v| PROJECT_WHITELIST.include?(k) } - assert_equal Hash.new, unrecognized, "The following submodules have unrecognized licenses:\n* #{unrecognized.keys.join("\n* ")}" + message = "The following submodules have unrecognized licenses:\n* #{unrecognized.keys.join("\n* ")}\n" + message << "Please ensure that the project's LICENSE file contains the full text of the license." + assert_equal Hash.new, unrecognized, message end def test_submodules_have_licenses unlicensed = submodule_licenses.select { |k,v| v.nil? }.reject { |k,v| PROJECT_WHITELIST.include?(k) } - assert_equal Hash.new, unlicensed, "The following submodules don't have licenses:\n* #{unlicensed.keys.join("\n* ")}" + message = "The following submodules don't have licenses:\n* #{unlicensed.keys.join("\n* ")}\n" + message << "Please ensure that the project has a LICENSE file, and that the LICENSE file contains the full text of the license." + assert_equal Hash.new, unlicensed, message end def test_submodules_have_approved_licenses From 13695a716c743ac9e9aa12c879889666ae084d8a Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Wed, 26 Aug 2015 09:46:02 -0400 Subject: [PATCH 017/227] Update X10 grammar license. --- vendor/grammars/X10 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/X10 b/vendor/grammars/X10 index 05fc5c81..a96e3f0a 160000 --- a/vendor/grammars/X10 +++ b/vendor/grammars/X10 @@ -1 +1 @@ -Subproject commit 05fc5c81cc9491f5785e896c9a5f43a61fac9073 +Subproject commit a96e3f0a352af9074a1086f092e8490022cb356c From 7c3e2650333f3d2ac10a48f8d41262281782e588 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Wed, 26 Aug 2015 12:31:29 -0400 Subject: [PATCH 018/227] also add help for unapproved licenses --- test/test_grammars.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_grammars.rb b/test/test_grammars.rb index 82086db9..569da5c9 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -97,7 +97,9 @@ class TestGrammars < Minitest::Test def test_submodules_have_approved_licenses unapproved = submodule_licenses.reject { |k,v| LICENSE_WHITELIST.include?(v) || PROJECT_WHITELIST.include?(k) }.map { |k,v| "#{k}: #{v}"} - assert_equal [], unapproved, "The following submodules have unapproved licenses:\n* #{unapproved.join("\n* ")}" + message = "The following submodules have unapproved licenses:\n* #{unapproved.join("\n* ")}\n" + message << "The license must be added to the LICENSE_WHITELIST in /test/test_grammars.rb once approved." + assert_equal [], unapproved, message end def test_submodules_whitelist_has_no_extra_entries From b1c6b330e9164116cc15273c7ace0452abbe3bef Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Wed, 26 Aug 2015 14:26:30 -0400 Subject: [PATCH 019/227] Switch to Apache License. --- vendor/grammars/X10 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/X10 b/vendor/grammars/X10 index a96e3f0a..2bae6e77 160000 --- a/vendor/grammars/X10 +++ b/vendor/grammars/X10 @@ -1 +1 @@ -Subproject commit a96e3f0a352af9074a1086f092e8490022cb356c +Subproject commit 2bae6e77fabcdceff753823477390c37305ca76c From cf5268a7d49301eefaf96c97f08ece68d928b24a Mon Sep 17 00:00:00 2001 From: Michael Fellinger Date: Fri, 28 Aug 2015 14:04:10 -0400 Subject: [PATCH 020/227] add Pony language --- .gitmodules | 3 + grammars.yml | 2 + lib/linguist/languages.yml | 7 + samples/Pony/circle.pony | 30 ++++ samples/Pony/counter.pony | 32 +++++ samples/Pony/gups-opt.pony | 261 ++++++++++++++++++++++++++++++++++ samples/Pony/hello-world.pony | 3 + samples/Pony/mandelbrot.pony | 188 ++++++++++++++++++++++++ samples/Pony/mixed.pony | 130 +++++++++++++++++ vendor/grammars/sublime-pony | 1 + 10 files changed, 657 insertions(+) create mode 100644 samples/Pony/circle.pony create mode 100644 samples/Pony/counter.pony create mode 100644 samples/Pony/gups-opt.pony create mode 100644 samples/Pony/hello-world.pony create mode 100644 samples/Pony/mandelbrot.pony create mode 100644 samples/Pony/mixed.pony create mode 160000 vendor/grammars/sublime-pony diff --git a/.gitmodules b/.gitmodules index 35cc9de8..582a9f9e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -674,3 +674,6 @@ [submodule "vendor/grammars/sublime-typescript"] path = vendor/grammars/sublime-typescript url = https://github.com/Microsoft/TypeScript-Sublime-Plugin +[submodule "vendor/grammars/sublime-pony"] + path = vendor/grammars/sublime-pony + url = https://github.com/CausalityLtd/sublime-pony diff --git a/grammars.yml b/grammars.yml index ae9ff92c..0fcdf052 100644 --- a/grammars.yml +++ b/grammars.yml @@ -505,6 +505,8 @@ vendor/grammars/sublime-nix: vendor/grammars/sublime-opal/: - source.opal - source.opalsysdefs +vendor/grammars/sublime-pony: +- source.pony vendor/grammars/sublime-robot-plugin: - text.robot vendor/grammars/sublime-rust: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 5b31ed4f..7ef4cebc 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2604,6 +2604,13 @@ PogoScript: tm_scope: source.pogoscript ace_mode: text +Pony: + type: programming + extensions: + - .pony + tm_scope: source.pony + ace_mode: text + PostScript: type: markup extensions: diff --git a/samples/Pony/circle.pony b/samples/Pony/circle.pony new file mode 100644 index 00000000..06d734d7 --- /dev/null +++ b/samples/Pony/circle.pony @@ -0,0 +1,30 @@ +use "collections" + +class Circle + var _radius: F32 + + new create(radius': F32) => + _radius = radius' + + fun ref get_radius(): F32 => + _radius + + fun ref get_area(): F32 => + F32.pi() * _radius.pow(2) + + fun ref get_circumference(): F32 => + 2 * _radius * F32.pi() + +actor Main + new create(env: Env) => + + for i in Range[F32](1.0, 101.0) do + let c = Circle(i) + + var str = + "Radius: " + c.get_radius().string() + "\n" + + "Circumference: " + c.get_circumference().string() + "\n" + + "Area: " + c.get_area().string() + "\n" + + env.out.print(str) + end diff --git a/samples/Pony/counter.pony b/samples/Pony/counter.pony new file mode 100644 index 00000000..cbb583bd --- /dev/null +++ b/samples/Pony/counter.pony @@ -0,0 +1,32 @@ +use "collections" + +actor Counter + var _count: U32 + + new create() => + _count = 0 + + be increment() => + _count = _count + 1 + + be get_and_reset(main: Main) => + main.display(_count) + _count = 0 + +actor Main + var _env: Env + + new create(env: Env) => + _env = env + + var count: U32 = try env.args(1).u32() else 10 end + var counter = Counter + + for i in Range[U32](0, count) do + counter.increment() + end + + counter.get_and_reset(this) + + be display(result: U32) => + _env.out.print(result.string()) diff --git a/samples/Pony/gups-opt.pony b/samples/Pony/gups-opt.pony new file mode 100644 index 00000000..52fad32f --- /dev/null +++ b/samples/Pony/gups-opt.pony @@ -0,0 +1,261 @@ +use "options" +use "time" +use "collections" + +class Config + var logtable: U64 = 20 + var iterate: U64 = 10000 + var logchunk: U64 = 10 + var logactors: U64 = 2 + + fun ref apply(env: Env): Bool => + var options = Options(env) + + options + .add("logtable", "l", I64Argument) + .add("iterate", "i", I64Argument) + .add("chunk", "c", I64Argument) + .add("actors", "a", I64Argument) + + for option in options do + match option + | ("table", var arg: I64) => logtable = arg.u64() + | ("iterate", var arg: I64) => iterate = arg.u64() + | ("chunk", var arg: I64) => logchunk = arg.u64() + | ("actors", var arg: I64) => logactors = arg.u64() + | let err: ParseError => + err.report(env.out) + env.out.print( + """ + gups_opt [OPTIONS] + --table N log2 of the total table size. Defaults to 20. + --iterate N number of iterations. Defaults to 10000. + --chunk N log2 of the chunk size. Defaults to 10. + --actors N log2 of the actor count. Defaults to 2. + """ + ) + return false + end + end + + env.out.print( + "logtable: " + logtable.string() + + "\niterate: " + iterate.string() + + "\nlogchunk: " + logchunk.string() + + "\nlogactors: " + logactors.string() + ) + true + +actor Main + let _env: Env + let _config: Config = Config + + var _updates: U64 = 0 + var _confirm: U64 = 0 + let _start: U64 + var _actors: Array[Updater] val + + new create(env: Env) => + _env = env + + if _config(env) then + let actor_count = 1 << _config.logactors + let loglocal = _config.logtable - _config.logactors + let chunk_size = 1 << _config.logchunk + let chunk_iterate = chunk_size * _config.iterate + + _updates = chunk_iterate * actor_count + _confirm = actor_count + + var updaters = recover Array[Updater](actor_count) end + + for i in Range[U64](0, actor_count) do + updaters.push(Updater(this, actor_count, i, loglocal, chunk_size, + chunk_iterate * i)) + end + + _actors = consume updaters + _start = Time.nanos() + + for a in _actors.values() do + a.start(_actors, _config.iterate) + end + else + _start = 0 + _actors = recover Array[Updater] end + end + + be done() => + if (_confirm = _confirm - 1) == 1 then + for a in _actors.values() do + a.done() + end + end + + be confirm() => + _confirm = _confirm + 1 + + if _confirm == _actors.size() then + let elapsed = (Time.nanos() - _start).f64() + let gups = _updates.f64() / elapsed + + _env.out.print( + "Time: " + (elapsed / 1e9).string() + + "\nGUPS: " + gups.string() + ) + end + +actor Updater + let _main: Main + let _index: U64 + let _updaters: U64 + let _chunk: U64 + let _mask: U64 + let _loglocal: U64 + + let _output: Array[Array[U64] iso] + let _reuse: List[Array[U64] iso] = List[Array[U64] iso] + var _others: (Array[Updater] val | None) = None + var _table: Array[U64] + var _rand: U64 + + new create(main:Main, updaters: U64, index: U64, loglocal: U64, chunk: U64, + seed: U64) + => + _main = main + _index = index + _updaters = updaters + _chunk = chunk + _mask = updaters - 1 + _loglocal = loglocal + + _rand = PolyRand.seed(seed) + _output = _output.create(updaters) + + let size = 1 << loglocal + _table = Array[U64].undefined(size) + + var offset = index * size + + try + for i in Range[U64](0, size) do + _table(i) = i + offset + end + end + + be start(others: Array[Updater] val, iterate: U64) => + _others = others + iteration(iterate) + + be apply(iterate: U64) => + iteration(iterate) + + fun ref iteration(iterate: U64) => + let chk = _chunk + + for i in Range(0, _updaters) do + _output.push( + try + _reuse.pop() + else + recover Array[U64](chk) end + end + ) + end + + for i in Range(0, _chunk) do + var datum = _rand = PolyRand(_rand) + var updater = (datum >> _loglocal) and _mask + + try + if updater == _index then + _table(i) = _table(i) xor datum + else + _output(updater).push(datum) + end + end + end + + try + let to = _others as Array[Updater] val + + repeat + let data = _output.pop() + + if data.size() > 0 then + to(_output.size()).receive(consume data) + else + _reuse.push(consume data) + end + until _output.size() == 0 end + end + + if iterate > 1 then + apply(iterate - 1) + else + _main.done() + end + + be receive(data: Array[U64] iso) => + try + for i in Range(0, data.size()) do + let datum = data(i) + var j = (datum >> _loglocal) and _mask + _table(j) = _table(j) xor datum + end + + data.clear() + _reuse.push(consume data) + end + + be done() => + _main.confirm() + +primitive PolyRand + fun apply(prev: U64): U64 => + (prev << 1) xor if prev.i64() < 0 then _poly() else 0 end + + fun seed(from: U64): U64 => + var n = from % _period() + + if n == 0 then + return 1 + end + + var m2 = Array[U64].undefined(64) + var temp = U64(1) + + try + for i in Range(0, 64) do + m2(i) = temp + temp = this(temp) + temp = this(temp) + end + end + + var i: U64 = 64 - n.clz() + var r = U64(2) + + try + while i > 0 do + temp = 0 + + for j in Range(0, 64) do + if ((r >> j) and 1) != 0 then + temp = temp xor m2(j) + end + end + + r = temp + i = i - 1 + + if ((n >> i) and 1) != 0 then + r = this(r) + end + end + end + r + + fun _poly(): U64 => 7 + + fun _period(): U64 => 1317624576693539401 diff --git a/samples/Pony/hello-world.pony b/samples/Pony/hello-world.pony new file mode 100644 index 00000000..9f7258e2 --- /dev/null +++ b/samples/Pony/hello-world.pony @@ -0,0 +1,3 @@ +actor Main + new create(env: Env) => + env.out.print("Hello, world.") diff --git a/samples/Pony/mandelbrot.pony b/samples/Pony/mandelbrot.pony new file mode 100644 index 00000000..cae7ea1d --- /dev/null +++ b/samples/Pony/mandelbrot.pony @@ -0,0 +1,188 @@ +use "files" +use "options" +use "collections" + +actor Worker + new mandelbrot(main: Main, x: U64, y: U64, width: U64, iterations: U64, + limit: F32, real: Array[F32] val, imaginary: Array[F32] val) + => + var view: Array[U8] iso = + recover + Array[U8]((y - x) * (width >> 3)) + end + + let group_r = Array[F32].undefined(8) + let group_i = Array[F32].undefined(8) + + var row = x + + try + while row < y do + let prefetch_i = imaginary(row) + + var col: U64 = 0 + + while col < width do + var j: U64 = 0 + + while j < 8 do + group_r.update(j, real(col + j)) + group_i.update(j, prefetch_i) + j = j + 1 + end + + var bitmap: U8 = 0xFF + var n = iterations + + repeat + var mask: U8 = 0x80 + var k: U64 = 0 + + while k < 8 do + let r = group_r(k) + let i = group_i(k) + + group_r.update(k, ((r * r) - (i * i)) + real(col + k)) + group_i.update(k, (2.0 * r * i) + prefetch_i) + + if ((r * r) + (i * i)) > limit then + bitmap = bitmap and not mask + end + + mask = mask >> 1 + k = k + 1 + end + until (bitmap == 0) or ((n = n - 1) == 1) end + + view.push(bitmap) + + col = col + 8 + end + row = row + 1 + end + + main.draw(x * (width >> 3), consume view) + end + +actor Main + var iterations: U64 = 50 + var limit: F32 = 4.0 + var chunks: U64 = 16 + var width: U64 = 16000 + var actors: U64 = 0 + var header: U64 = 0 + var real: Array[F32] val = recover Array[F32] end + var imaginary: Array[F32] val = recover Array[F32] end + var outfile: (File | None) = None + + new create(env: Env) => + try + arguments(env) + + let length = width + let recip_width = 2.0 / width.f32() + + var r = recover Array[F32](length) end + var i = recover Array[F32](length) end + + for j in Range(0, width) do + r.push((recip_width * j.f32()) - 1.5) + i.push((recip_width * j.f32()) - 1.0) + end + + real = consume r + imaginary = consume i + + spawn_actors() + create_outfile() + end + + be draw(offset: U64, pixels: Array[U8] val) => + match outfile + | var out: File => + out.seek_start(header + offset) + out.write(pixels) + if (actors = actors - 1) == 1 then + out.dispose() + end + end + + fun ref create_outfile() => + match outfile + | var f: File => + f.print("P4\n " + width.string() + " " + width.string() + "\n") + header = f.size() + f.set_length((width * (width >> 3)) + header) + end + + fun ref spawn_actors() => + actors = ((width + (chunks - 1)) / chunks) + + var rest = width % chunks + + if rest == 0 then rest = chunks end + + var x: U64 = 0 + var y: U64 = 0 + + for i in Range(0, actors - 1) do + x = i * chunks + y = x + chunks + Worker.mandelbrot(this, x, y, width, iterations, limit, real, imaginary) + end + + Worker.mandelbrot(this, y, y + rest, width, iterations, limit, real, + imaginary) + + fun ref arguments(env: Env) ? => + let options = Options(env) + + options + .add("iterations", "i", I64Argument) + .add("limit", "l", F64Argument) + .add("chunks", "c", I64Argument) + .add("width", "w", I64Argument) + .add("output", "o", StringArgument) + + for option in options do + match option + | ("iterations", var arg: I64) => iterations = arg.u64() + | ("limit", var arg: F64) => limit = arg.f32() + | ("chunks", var arg: I64) => chunks = arg.u64() + | ("width", var arg: I64) => width = arg.u64() + | ("output", var arg: String) => + outfile = try File(FilePath(env.root, arg)) end + | let err: ParseError => err.report(env.out) ; usage(env) ; error + end + end + + fun tag usage(env: Env) => + env.out.print( + """ + mandelbrot [OPTIONS] + + The binary output can be converted to a BMP with the following command + (ImageMagick Tools required): + + convert JPEG:.jpg + + Available options: + + --iterations, -i Maximum amount of iterations to be done for each pixel. + Defaults to 50. + + --limit, -l Square of the limit that pixels need to exceed in order + to escape from the Mandelbrot set. + Defaults to 4.0. + + --chunks, -c Maximum line count of chunks the image should be + divided into for divide & conquer processing. + Defaults to 16. + + --width, -w Lateral length of the resulting mandelbrot image. + Defaults to 16000. + + --output, -o File to write the output to. + + """ + ) diff --git a/samples/Pony/mixed.pony b/samples/Pony/mixed.pony new file mode 100644 index 00000000..d55a161c --- /dev/null +++ b/samples/Pony/mixed.pony @@ -0,0 +1,130 @@ +use "collections" + +actor Worker + var _env: Env + + new create(env: Env) => + _env = env + + var a: U64 = 86028157 + var b: U64 = 329545133 + + var result = factorize(a*b) + + var correct = + try + (result.size() == 2) and + (result(0) == 86028157) and + (result(1) == 329545133) + else + false + end + + fun ref factorize(bigint: U64) : Array[U64] => + var factors = Array[U64](2) + + if bigint <= 3 then + factors.push(bigint) + else + var d: U64 = 2 + var i: U64 = 0 + var n = bigint + + while d < n do + if (n % d) == 0 then + i = i + 1 + factors.push(d) + n = n / d + else + d = if d == 2 then 3 else (d + 2) end + end + end + + factors.push(d) + end + + factors + +actor Ring + var _env: Env + var _size: U32 + var _pass: U32 + var _repetitions: U32 + var _next: Ring + + new create(env: Env, size: U32, pass: U32, repetitions: U32) => + _env = env + _size = size + _pass = pass + _repetitions = repetitions + _next = spawn_ring(_env, _size, _pass) + run() + + new neighbor(env: Env, next: Ring) => + _env = env + _next = next + _size = 0 + _pass = 0 + _repetitions = 0 + + be apply(i: U32) => + if i > 0 then + _next(i - 1) + else + run() + end + + fun ref run() => + if _repetitions > 0 then + _repetitions = _repetitions - 1 + _next(_pass * _size) + Worker(_env) + end + + fun tag spawn_ring(env: Env, size: U32, pass': U32) : Ring => + var next: Ring = this + + for i in Range[U32](0, size) do + next = Ring.neighbor(env, next) + end + + next + +actor Main + var _size: U32 = 50 + var _count: U32 = 20 + var _pass: U32 = 10000 + var _repetitions: U32 = 5 + var _env: Env + + new create(env: Env) => + _env = env + + try + arguments() + start_benchmark() + else + usage() + end + + fun ref arguments() ? => + _count = _env.args(1).u32() + _size = _env.args(2).u32() + _pass = _env.args(3).u32() + _repetitions = _env.args(4).u32() + + fun ref start_benchmark() => + for i in Range[U32](0, _count) do + Ring(_env, _size, _pass, _repetitions) + end + + fun ref usage() => + _env.out.print( + """ + mixed OPTIONS + N number of actors in each ring" + N number of rings" + N number of messages to pass around each ring" + N number of times to repeat" + """ + ) diff --git a/vendor/grammars/sublime-pony b/vendor/grammars/sublime-pony new file mode 160000 index 00000000..6197c402 --- /dev/null +++ b/vendor/grammars/sublime-pony @@ -0,0 +1 @@ +Subproject commit 6197c4028eb04dcb1c443160047e4c84c80d863e From dd8eaf2893030d808fdf10553f79ac75ae5f596c Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sun, 30 Aug 2015 12:32:33 +0200 Subject: [PATCH 021/227] Alphabetise heuristics. --- lib/linguist/heuristics.rb | 372 ++++++++++++++++++------------------- test/test_heuristics.rb | 208 ++++++++++----------- 2 files changed, 290 insertions(+), 290 deletions(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 4d468bf0..dd1f8ee6 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -67,6 +67,16 @@ module Linguist # Common heuristics ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronized|selector|implementation)\b/ + disambiguate ".asc" do |data| + if /^(----[- ]BEGIN|ssh-(rsa|dss)) /.match(data) + Language["Public Key"] + elsif /^[=-]+(\s|\n)|{{[A-Za-z]/.match(data) + Language["AsciiDoc"] + elsif /^(\/\/.+|((import|export)\s+)?(function|int|float|char)\s+((room|repeatedly|on|game)_)?([A-Za-z]+[A-Za-z_0-9]+)\s*[;\(])/.match(data) + Language["AGS Script"] + end + end + disambiguate ".bb" do |data| if /^\s*; /.match(data) || data.include?("End Function") Language["BlitzBasic"] @@ -75,67 +85,9 @@ module Linguist end end - disambiguate ".cs" do |data| - if /![\w\s]+methodsFor: /.match(data) - Language["Smalltalk"] - elsif /^\s*namespace\s*[\w\.]+\s*{/.match(data) || /^\s*\/\//.match(data) - Language["C#"] - end - end - - disambiguate ".h" do |data| - if ObjectiveCRegex.match(data) - Language["Objective-C"] - elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) || - /^\s*template\s* ")) - Language["GAP"] - # Heads up - we don't usually write heuristics like this (with no regex match) - else - Language["Scilab"] + disambiguate ".ch" do |data| + if /^\s*#\s*(if|ifdef|ifndef|define|command|xcommand|translate|xtranslate|include|pragma|undef)\b/i.match(data) + Language["xBase"] end end @@ -149,29 +101,29 @@ module Linguist end end - disambiguate ".php" do |data| - if data.include?("/.match(data) || + /^\s*template\s*)/.match(data) + Language["Lex"] + elsif /^\.[a-z][a-z](\s|$)/i.match(data) + Language["Groff"] + elsif /^\((de|class|rel|code|data|must)\s/.match(data) + Language["PicoLisp"] + end + end + + disambiguate ".ls" do |data| + if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data) + Language["LoomScript"] + else + Language["LiveScript"] + end + end + + disambiguate ".lsp", ".lisp" do |data| + if /^\s*\((defun|in-package|defpackage) /i.match(data) + Language["Common Lisp"] + elsif /^\s*\(define /.match(data) + Language["NewLisp"] + end + end + disambiguate ".m" do |data| if ObjectiveCRegex.match(data) Language["Objective-C"] @@ -213,41 +216,113 @@ module Linguist end end - disambiguate ".gs" do |data| - Language["Gosu"] if /^uses java\./.match(data) - end - - disambiguate ".ls" do |data| - if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data) - Language["LoomScript"] - else - Language["LiveScript"] + disambiguate ".ml" do |data| + if /(^\s*module)|let rec |match\s+(\S+\s)+with/.match(data) + Language["OCaml"] + elsif /=> |case\s+(\S+\s)+of/.match(data) + Language["Standard ML"] end end - disambiguate ".lsp", ".lisp" do |data| - if /^\s*\((defun|in-package|defpackage) /i.match(data) - Language["Common Lisp"] - elsif /^\s*\(define /.match(data) + disambiguate ".mod" do |data| + if data.include?(' |case\s+(\S+\s)+of/.match(data) - Language["Standard ML"] - end - end - - disambiguate ".mod" do |data| - if data.include?(' ")) + Language["GAP"] + # Heads up - we don't usually write heuristics like this (with no regex match) else - Language["NewLisp"] - end - end - - disambiguate ".rs" do |data| - if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data) - Language["Rust"] - elsif /#include|#pragma\s+(rs|version)|__attribute__/.match(data) - Language["RenderScript"] - end - end - - disambiguate ".l" do |data| - if /\(def(un|macro)\s/.match(data) - Language["Common Lisp"] - elsif /^(%[%{}]xs|<.*>)/.match(data) - Language["Lex"] - elsif /^\.[a-z][a-z](\s|$)/i.match(data) - Language["Groff"] - elsif /^\((de|class|rel|code|data|must)\s/.match(data) - Language["PicoLisp"] - end - end - - disambiguate ".n" do |data| - if /^[.']/.match(data) - Language["Groff"] - elsif /^(module|namespace|using)\s/.match(data) - Language["Nemerle"] - end - end - - disambiguate ".ms" do |data| - if /^[.'][a-z][a-z](\s|$)/i.match(data) - Language["Groff"] - elsif /((^|\s)move?[. ])|\.(include|globa?l)\s/.match(data) - Language["GAS"] - end - end - - disambiguate ".ch" do |data| - if /^\s*#\s*(if|ifdef|ifndef|define|command|xcommand|translate|xtranslate|include|pragma|undef)\b/i.match(data) - Language["xBase"] - end - end - - disambiguate ".r" do |data| - if /\bRebol\b/i.match(data) - Language["Rebol"] - elsif data.include?("<-") - Language["R"] + Language["Scilab"] end end end diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index cca48675..524a522a 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -33,6 +33,101 @@ class TestHeuristcs < Minitest::Test end end + def test_detect_still_works_if_nothing_matches + blob = Linguist::FileBlob.new(File.join(samples_path, "Objective-C/hello.m")) + match = Language.detect(blob) + assert_equal Language["Objective-C"], match + end + + # Candidate languages = ["AGS Script", "AsciiDoc", "Public Key"] + def test_asc_by_heuristics + assert_heuristics({ + "AsciiDoc" => all_fixtures("AsciiDoc", "*.asc"), + "AGS Script" => all_fixtures("AGS Script", "*.asc"), + "Public Key" => all_fixtures("Public Key", "*.asc") + }) + end + + def test_bb_by_heuristics + assert_heuristics({ + "BitBake" => all_fixtures("BitBake", "*.bb"), + "BlitzBasic" => all_fixtures("BlitzBasic", "*.bb") + }) + end + + def test_ch_by_heuristics + assert_heuristics({ + "xBase" => all_fixtures("xBase", ".ch") + }) + end + + def test_cl_by_heuristics + assert_heuristics({ + "Common Lisp" => all_fixtures("Common Lisp", "*.cl"), + "OpenCL" => all_fixtures("OpenCL", "*.cl") + }) + end + + def test_cs_by_heuristics + assert_heuristics({ + "C#" => all_fixtures("C#", "*.cs"), + "Smalltalk" => all_fixtures("Smalltalk", "*.cs") + }) + end + + # Candidate languages = ["ECL", "ECLiPSe"] + def test_ecl_by_heuristics + assert_heuristics({ + "ECL" => all_fixtures("ECL", "*.ecl"), + "ECLiPSe" => all_fixtures("ECLiPSe", "*.ecl") + }) + end + + def test_f_by_heuristics + assert_heuristics({ + "FORTRAN" => all_fixtures("FORTRAN", "*.f") + all_fixtures("FORTRAN", "*.for"), + "Forth" => all_fixtures("Forth", "*.f") + all_fixtures("Forth", "*.for") + }) + end + + def test_fr_by_heuristics + assert_heuristics({ + "Frege" => all_fixtures("Frege", "*.fr"), + "Forth" => all_fixtures("Forth", "*.fr"), + "Text" => all_fixtures("Text", "*.fr") + }) + end + + def test_fs_by_heuristics + assert_heuristics({ + "F#" => all_fixtures("F#", "*.fs"), + "Forth" => all_fixtures("Forth", "*.fs"), + "GLSL" => all_fixtures("GLSL", "*.fs") + }) + end + + # Candidate languages = ["Hack", "PHP"] + def test_hack_by_heuristics + assert_heuristics({ + "Hack" => all_fixtures("Hack", "*.php"), + "PHP" => all_fixtures("PHP", "*.php") + }) + end + + def test_ls_by_heuristics + assert_heuristics({ + "LiveScript" => all_fixtures("LiveScript", "*.ls"), + "LoomScript" => all_fixtures("LoomScript", "*.ls") + }) + end + + def test_lsp_by_heuristics + assert_heuristics({ + "Common Lisp" => all_fixtures("Common Lisp", "*.lsp") + all_fixtures("Common Lisp", "*.lisp"), + "NewLisp" => all_fixtures("NewLisp", "*.lsp") + all_fixtures("NewLisp", "*.lisp") + }) + end + # Candidate languages = ["C++", "Objective-C"] def test_obj_c_by_heuristics # Only calling out '.h' filenames as these are the ones causing issues @@ -43,12 +138,6 @@ class TestHeuristcs < Minitest::Test }) end - def test_detect_still_works_if_nothing_matches - blob = Linguist::FileBlob.new(File.join(samples_path, "Objective-C/hello.m")) - match = Language.detect(blob) - assert_equal Language["Objective-C"], match - end - # Candidate languages = ["Perl", "Perl6", "Prolog"] def test_pl_prolog_perl_by_heuristics assert_heuristics({ @@ -66,24 +155,6 @@ class TestHeuristcs < Minitest::Test }) end - # Candidate languages = ["Perl", "Perl6"] - def test_t_perl_by_heuristics - assert_heuristics({ - "Perl" => all_fixtures("Perl", "*.t"), - "Perl6" => ["Perl6/01-dash-uppercase-i.t", "Perl6/01-parse.t", "Perl6/advent2009-day16.t", - "Perl6/basic-open.t", "Perl6/calendar.t", "Perl6/for.t", "Perl6/hash.t", - "Perl6/listquote-whitespace.t"] - }) - end - - # Candidate languages = ["ECL", "ECLiPSe"] - def test_ecl_by_heuristics - assert_heuristics({ - "ECL" => all_fixtures("ECL", "*.ecl"), - "ECLiPSe" => all_fixtures("ECLiPSe", "*.ecl") - }) - end - # Candidate languages = ["IDL", "Prolog", "QMake", "INI"] def test_pro_by_heuristics assert_heuristics({ @@ -94,34 +165,10 @@ class TestHeuristcs < Minitest::Test }) end - # Candidate languages = ["AGS Script", "AsciiDoc", "Public Key"] - def test_asc_by_heuristics + def test_r_by_heuristics assert_heuristics({ - "AsciiDoc" => all_fixtures("AsciiDoc", "*.asc"), - "AGS Script" => all_fixtures("AGS Script", "*.asc"), - "Public Key" => all_fixtures("Public Key", "*.asc") - }) - end - - def test_cl_by_heuristics - assert_heuristics({ - "Common Lisp" => all_fixtures("Common Lisp", "*.cl"), - "OpenCL" => all_fixtures("OpenCL", "*.cl") - }) - end - - def test_f_by_heuristics - assert_heuristics({ - "FORTRAN" => all_fixtures("FORTRAN", "*.f") + all_fixtures("FORTRAN", "*.for"), - "Forth" => all_fixtures("Forth", "*.f") + all_fixtures("Forth", "*.for") - }) - end - - # Candidate languages = ["Hack", "PHP"] - def test_hack_by_heuristics - assert_heuristics({ - "Hack" => all_fixtures("Hack", "*.php"), - "PHP" => all_fixtures("PHP", "*.php") + "R" => all_fixtures("R", "*.r") + all_fixtures("R", "*.R"), + "Rebol" => all_fixtures("Rebol", "*.r") }) end @@ -133,47 +180,13 @@ class TestHeuristcs < Minitest::Test }) end - def test_fs_by_heuristics + # Candidate languages = ["Perl", "Perl6"] + def test_t_perl_by_heuristics assert_heuristics({ - "F#" => all_fixtures("F#", "*.fs"), - "Forth" => all_fixtures("Forth", "*.fs"), - "GLSL" => all_fixtures("GLSL", "*.fs") - }) - end - - def test_fr_by_heuristics - assert_heuristics({ - "Frege" => all_fixtures("Frege", "*.fr"), - "Forth" => all_fixtures("Forth", "*.fr"), - "Text" => all_fixtures("Text", "*.fr") - }) - end - - def test_bb_by_heuristics - assert_heuristics({ - "BitBake" => all_fixtures("BitBake", "*.bb"), - "BlitzBasic" => all_fixtures("BlitzBasic", "*.bb") - }) - end - - def test_lsp_by_heuristics - assert_heuristics({ - "Common Lisp" => all_fixtures("Common Lisp", "*.lsp") + all_fixtures("Common Lisp", "*.lisp"), - "NewLisp" => all_fixtures("NewLisp", "*.lsp") + all_fixtures("NewLisp", "*.lisp") - }) - end - - def test_cs_by_heuristics - assert_heuristics({ - "C#" => all_fixtures("C#", "*.cs"), - "Smalltalk" => all_fixtures("Smalltalk", "*.cs") - }) - end - - def test_ls_by_heuristics - assert_heuristics({ - "LiveScript" => all_fixtures("LiveScript", "*.ls"), - "LoomScript" => all_fixtures("LoomScript", "*.ls") + "Perl" => all_fixtures("Perl", "*.t"), + "Perl6" => ["Perl6/01-dash-uppercase-i.t", "Perl6/01-parse.t", "Perl6/advent2009-day16.t", + "Perl6/basic-open.t", "Perl6/calendar.t", "Perl6/for.t", "Perl6/hash.t", + "Perl6/listquote-whitespace.t"] }) end @@ -183,17 +196,4 @@ class TestHeuristcs < Minitest::Test "XML" => all_fixtures("XML", "*.ts") }) end - - def test_ch_by_heuristics - assert_heuristics({ - "xBase" => all_fixtures("xBase", ".ch") - }) - end - - def test_r_by_heuristics - assert_heuristics({ - "R" => all_fixtures("R", "*.r") + all_fixtures("R", "*.R"), - "Rebol" => all_fixtures("Rebol", "*.r") - }) - end end From 6e05edc3506800ab7139b169c16cb18eb6d6d405 Mon Sep 17 00:00:00 2001 From: James Kyle Date: Mon, 31 Aug 2015 10:26:29 -0700 Subject: [PATCH 022/227] Add .jsproj extension --- lib/linguist/languages.yml | 1 + samples/JSProj/JSBrowser.jsproj | 96 +++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 samples/JSProj/JSBrowser.jsproj diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8a0bc395..02f73444 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3615,6 +3615,7 @@ XML: - .iml - .ivy - .jelly + - .jsproj - .kml - .launch - .mdpolicy diff --git a/samples/JSProj/JSBrowser.jsproj b/samples/JSProj/JSBrowser.jsproj new file mode 100644 index 00000000..78d2cb4d --- /dev/null +++ b/samples/JSProj/JSBrowser.jsproj @@ -0,0 +1,96 @@ + + + + + Debug + AnyCPU + + + Debug + ARM + + + Debug + x64 + + + Debug + x86 + + + Release + AnyCPU + + + Release + ARM + true + + + Release + x64 + true + + + Release + x86 + true + + + + 42fc11d8-64c6-4967-a15a-dfd787f68766 + + + + 14.0 + + + + + true + UAP + 10.0.10240.0 + 10.0.10240.0 + $(VersionNumberMajor).$(VersionNumberMinor) + en-US + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9b8bf9068f2ec2ea2de37a29b3c8ad40c922215f Mon Sep 17 00:00:00 2001 From: James Kyle Date: Mon, 31 Aug 2015 11:35:01 -0700 Subject: [PATCH 023/227] Move jsproj example to xml directory --- samples/{JSProj => XML}/JSBrowser.jsproj | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename samples/{JSProj => XML}/JSBrowser.jsproj (100%) diff --git a/samples/JSProj/JSBrowser.jsproj b/samples/XML/JSBrowser.jsproj similarity index 100% rename from samples/JSProj/JSBrowser.jsproj rename to samples/XML/JSBrowser.jsproj From e62d0e19a52d93cd72b3c47e5ace405a4fcf044b Mon Sep 17 00:00:00 2001 From: Alhadis Date: Tue, 1 Sep 2015 07:12:18 +1000 Subject: [PATCH 024/227] Add ".geojson" as a JSON extension --- lib/linguist/languages.yml | 1 + samples/JSON/geo.geojson | 82 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 samples/JSON/geo.geojson diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8a0bc395..19cd8ca9 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1546,6 +1546,7 @@ JSON: extensions: - .json - .lock + - .geojson filenames: - .jshintrc - composer.lock diff --git a/samples/JSON/geo.geojson b/samples/JSON/geo.geojson new file mode 100644 index 00000000..1c77693e --- /dev/null +++ b/samples/JSON/geo.geojson @@ -0,0 +1,82 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "name": "Australia Post - North Ryde BC", + "geo": [-33.787792, 151.13288], + "streetAddress": "11 Waterloo Road", + "addressLocality": "Macquarie Park", + "addressRegion": "New South Wales", + "addressCountry": "Australia", + "postalCode": "2113" + }, + "geometry": { + "type": "Point", + "coordinates": [151.13288, -33.787792, 0] + } + }, + + + { + "type": "Feature", + "properties": { + "name": "George Weston Foods Limited", + "geo": [-37.8263884, 144.9105381], + "streetAddress": "Level 3, 187 Todd Road", + "addressLocality": "Port Melbourne", + "addressRegion": "Victoria", + "addressCountry": "Australia", + "postalCode": "3207" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [144.9097088901841, -37.82622654171794, 0], + [144.9099724266943, -37.82679388891783, 0], + [144.9110127325916, -37.82651526396403, 0], + [144.9112227645738, -37.82655667152123, 0], + [144.9113739439796, -37.82618552508767, 0], + [144.9112740633105, -37.82615750100924, 0], + [144.9111355846674, -37.82584493693527, 0], + [144.9097088901841, -37.82622654171794, 0] + ] + ] + } + }, + + + { + "type": "Feature", + "properties": { + "name": "George Weston Foods Limited", + "geo": [-37.05202791502396, 144.2085614999388], + "streetAddress": "67 Richards Road", + "addressLocality": "Castlemaine", + "addressRegion": "Victoria", + "addressCountry": "Australia", + "postalCode": "3450" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [144.2052428913937, -37.04906391287216, 0], + [144.205540392692, -37.05049727485623, 0], + [144.2059800881858, -37.05066835966983, 0], + [144.206490656024, -37.05279538900776, 0], + [144.2064525845008, -37.05366195881602, 0], + [144.2084322301922, -37.0538920493147, 0], + [144.2084811895712, -37.05266519735124, 0], + [144.2079784002005, -37.05041270555773, 0], + [144.2074017905817, -37.04817406993293, 0], + [144.2061363939852, -37.04834972871226, 0], + [144.2052428913937, -37.04906391287216, 0] + ] + ] + } + } + ] +} From b428bce1265a5b99454f2effaceaf29b1d9b381f Mon Sep 17 00:00:00 2001 From: Alhadis Date: Tue, 1 Sep 2015 07:19:06 +1000 Subject: [PATCH 025/227] Quote NCL language's colour value Without double-quotes, the hex colour is interpreted as a YAML comment. Originally added in 2d39258. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 19cd8ca9..6f59cc19 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2128,7 +2128,7 @@ Myghty: NCL: type: programming - color: #28431f + color: "#28431f" extensions: - .ncl tm_scope: source.ncl From a167f852dd6a202cb2d28a8c1ed4bf83150c415b Mon Sep 17 00:00:00 2001 From: Alhadis Date: Tue, 1 Sep 2015 07:32:21 +1000 Subject: [PATCH 026/227] Alphabetise JSON extensions --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6f59cc19..446c81c2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1545,8 +1545,8 @@ JSON: searchable: false extensions: - .json - - .lock - .geojson + - .lock filenames: - .jshintrc - composer.lock From e4f5c0066a90a5e12a845d495196c051ad7bd038 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 31 Aug 2015 08:53:40 +0200 Subject: [PATCH 027/227] Add checks to keep heuristics alphabetised. --- test/test_pedantic.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/test_pedantic.rb b/test/test_pedantic.rb index 29b673ab..2d0372cc 100644 --- a/test/test_pedantic.rb +++ b/test/test_pedantic.rb @@ -32,6 +32,18 @@ class TestPedantic < Minitest::Test end end + def test_heuristics_are_sorted + file = File.expand_path("../../lib/linguist/heuristics.rb", __FILE__) + heuristics = open(file).each.grep(/^ *disambiguate/) + assert_sorted heuristics + end + + def test_heuristics_tests_are_sorted + file = File.expand_path("../test_heuristics.rb", __FILE__) + tests = open(file).each.grep(/^ *def test_[a-z_]+_by_heuristics/) + assert_sorted tests + end + def assert_sorted(list) list.each_cons(2) do |previous, item| flunk "#{previous} should come after #{item}" if previous > item From 5afdd2c533ccb6669eef2a9d848bcb6231380370 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Tue, 1 Sep 2015 14:23:59 +0300 Subject: [PATCH 028/227] Add color for the PL/SQL language. I have added color to the PL/SQL language: #dad8d8. I take this color from a window background which evokes the interface of the language. --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8a0bc395..f01f2c26 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2443,6 +2443,7 @@ PLSQL: type: programming ace_mode: sql tm_scope: source.plsql.oracle + color: "#dad8d8" extensions: - .pls - .pkb From f0242f6f97a2c439e868a3e4c3277bd7d56117bb Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 1 Sep 2015 19:12:27 +0100 Subject: [PATCH 029/227] Updating grammars --- vendor/grammars/Handlebars | 2 +- vendor/grammars/Lean.tmbundle | 2 +- vendor/grammars/Sublime-Nit | 2 +- vendor/grammars/Sublime-SQF-Language | 2 +- vendor/grammars/SublimePapyrus | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/dart-sublime-bundle | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/haxe-sublime-bundle | 2 +- vendor/grammars/java.tmbundle | 2 +- vendor/grammars/language-gfm | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-python | 2 +- vendor/grammars/language-shellscript | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/powershell | 2 +- vendor/grammars/sublime-aspectj | 2 +- vendor/grammars/sublime-rust | 2 +- vendor/grammars/sublime-typescript | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/vendor/grammars/Handlebars b/vendor/grammars/Handlebars index 64f29314..88a0836a 160000 --- a/vendor/grammars/Handlebars +++ b/vendor/grammars/Handlebars @@ -1 +1 @@ -Subproject commit 64f293140c16666bc1fc7b91d14388d5c3f66d8c +Subproject commit 88a0836abe8de6bf4a4f0ac878bcd3087f0fef95 diff --git a/vendor/grammars/Lean.tmbundle b/vendor/grammars/Lean.tmbundle index dd3e30f0..943ac84b 160000 --- a/vendor/grammars/Lean.tmbundle +++ b/vendor/grammars/Lean.tmbundle @@ -1 +1 @@ -Subproject commit dd3e30f0581b14b8a4830d6b46eaa86bf62058e8 +Subproject commit 943ac84bf69bfbcab54eeeebba6d66c90ed700ff diff --git a/vendor/grammars/Sublime-Nit b/vendor/grammars/Sublime-Nit index 7d8b3503..e1e5463c 160000 --- a/vendor/grammars/Sublime-Nit +++ b/vendor/grammars/Sublime-Nit @@ -1 +1 @@ -Subproject commit 7d8b3503923edb3dd0fa0f8e0684dd33e7897446 +Subproject commit e1e5463c9cc83d61e48617dbe370307e358162b2 diff --git a/vendor/grammars/Sublime-SQF-Language b/vendor/grammars/Sublime-SQF-Language index 6d0f3f6c..81c5be35 160000 --- a/vendor/grammars/Sublime-SQF-Language +++ b/vendor/grammars/Sublime-SQF-Language @@ -1 +1 @@ -Subproject commit 6d0f3f6cee23a79f59af9ab263841c1533cd54f1 +Subproject commit 81c5be35bff3d1f8d77d8abeb8ca1c2d7c124899 diff --git a/vendor/grammars/SublimePapyrus b/vendor/grammars/SublimePapyrus index 2451bac8..a9d818f0 160000 --- a/vendor/grammars/SublimePapyrus +++ b/vendor/grammars/SublimePapyrus @@ -1 +1 @@ -Subproject commit 2451bac8ef1c06b8d4c514d5a417dd6fd295dda4 +Subproject commit a9d818f0ac24d8576db3bf703b78c7c675705439 diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index e7a4159f..2cbcaca9 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit e7a4159fbf680ba4cafa9115ea7264a9cdba0fd0 +Subproject commit 2cbcaca93cbb94319f249a35653e3f3a24571a32 diff --git a/vendor/grammars/dart-sublime-bundle b/vendor/grammars/dart-sublime-bundle index 3e3ac8cc..d61e6efc 160000 --- a/vendor/grammars/dart-sublime-bundle +++ b/vendor/grammars/dart-sublime-bundle @@ -1 +1 @@ -Subproject commit 3e3ac8cc0366048a617a6056d7f6e2f1c8ccf4fe +Subproject commit d61e6efcbdec3c7c4a47e5355ce31b57020b24c9 diff --git a/vendor/grammars/factor b/vendor/grammars/factor index ac5da311..b2a51dfe 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit ac5da311f73401db4adc28936c6aaae587a713ee +Subproject commit b2a51dfeb2bc721c0c908d3f0fa56ddf9202d06c diff --git a/vendor/grammars/haxe-sublime-bundle b/vendor/grammars/haxe-sublime-bundle index 102acf66..c3b96f1c 160000 --- a/vendor/grammars/haxe-sublime-bundle +++ b/vendor/grammars/haxe-sublime-bundle @@ -1 +1 @@ -Subproject commit 102acf66b921526401ce76f0a74c7f94edaca678 +Subproject commit c3b96f1c754ebc91bacc2926412042567fabbb5a diff --git a/vendor/grammars/java.tmbundle b/vendor/grammars/java.tmbundle index 5f420457..64294ae0 160000 --- a/vendor/grammars/java.tmbundle +++ b/vendor/grammars/java.tmbundle @@ -1 +1 @@ -Subproject commit 5f4204576e13a73c9dfce525d8ced41a39d004c3 +Subproject commit 64294ae0b62b64b1183c401e3803679eaddb4946 diff --git a/vendor/grammars/language-gfm b/vendor/grammars/language-gfm index 9b95c2ad..597d382a 160000 --- a/vendor/grammars/language-gfm +++ b/vendor/grammars/language-gfm @@ -1 +1 @@ -Subproject commit 9b95c2ad7c3c1261e54b11919f71ec3ad473aad9 +Subproject commit 597d382a8c5a23a3f358f6edb81e3f0ff6e17a30 diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index 39fd6989..c5c381e3 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit 39fd6989f78e1be265dc6ce9ba7a0ac450525864 +Subproject commit c5c381e37812219db84cb5916094ca3b8dce62db diff --git a/vendor/grammars/language-python b/vendor/grammars/language-python index 7d38baf8..8933c523 160000 --- a/vendor/grammars/language-python +++ b/vendor/grammars/language-python @@ -1 +1 @@ -Subproject commit 7d38baf80b89c1dc58e77f8a12763c5d18d5e1e5 +Subproject commit 8933c5239ab946c4d8f3417b04f6dfc2e3448968 diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript index cb582fd0..a6823795 160000 --- a/vendor/grammars/language-shellscript +++ b/vendor/grammars/language-shellscript @@ -1 +1 @@ -Subproject commit cb582fd056f91f19d265a3d0db0e161da52031ed +Subproject commit a6823795885801b62c7fceca41adaa4bf4de7a69 diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index 23e62234..6358337b 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit 23e622349857b2e2181201e510c84fcec8e909d6 +Subproject commit 6358337b629fd9c17ac8c92f00e88859e6577d4f diff --git a/vendor/grammars/powershell b/vendor/grammars/powershell index 18c9f0e5..982ae21d 160000 --- a/vendor/grammars/powershell +++ b/vendor/grammars/powershell @@ -1 +1 @@ -Subproject commit 18c9f0e553f68053713503b8dcca2c4712381ad6 +Subproject commit 982ae21d54b3affc498131515ebbfca6b186ac16 diff --git a/vendor/grammars/sublime-aspectj b/vendor/grammars/sublime-aspectj index 888fefdd..72b35f79 160000 --- a/vendor/grammars/sublime-aspectj +++ b/vendor/grammars/sublime-aspectj @@ -1 +1 @@ -Subproject commit 888fefdd2f8db57628d7bd36e2388f1f534c00a7 +Subproject commit 72b35f795c2d7800ea65eb91b32d7594748dc561 diff --git a/vendor/grammars/sublime-rust b/vendor/grammars/sublime-rust index 386d8fcd..cff9c9c1 160000 --- a/vendor/grammars/sublime-rust +++ b/vendor/grammars/sublime-rust @@ -1 +1 @@ -Subproject commit 386d8fcdc522d469c0d451f383f5b4aaaec7369f +Subproject commit cff9c9c1c60f2bb4dc720931ceb37bcc12598334 diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index 0d519e5a..cf0fe35e 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit 0d519e5a5592bd4152523fe359d1a0ebbe9cc493 +Subproject commit cf0fe35e3653d1de1605ac1d20ecba43dbd29709 From 13702451abaa0c6d5d20c4902534399240334184 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 1 Sep 2015 19:13:02 +0100 Subject: [PATCH 030/227] Bumping to v4.5.15 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 1ba6a51b..dbdb7d7f 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.5.14" + VERSION = "4.5.15" end From 1b327e29baf00b63c34a00f4118141fb30827d8c Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Tue, 1 Sep 2015 21:51:48 +0300 Subject: [PATCH 031/227] Add colors for some languages. These are effected languages and the reason behind the proposed colors: - Ant Build System: The color of logo (http://ant.apache.org/images/project-logo.gif). - AppleScript: AppleScript editor logo (https://en.wikipedia.org/wiki/AppleScript#/media/File:AppleScript_Editor_Logo.png). - Batchfile: Batch file icon in Windows (https://en.wikipedia.org/wiki/Batch_file#/media/File:Batch_file_icon_in_Windows_Vista.png). - Bison: A color taken from a bison (https://en.wikipedia.org/wiki/Bison#/media/File:Americanbison.jpg). - Cucumber: Official logo color (https://cucumber.io/images/cucumber-logo.svg). - Cuda: Nvidia(creator of CUDA) logo color (http://www.nvidia.com/content/includes/redesign2010/images/redesign10/nvidia_logo.png). - Gradle: Official Gradle logo color (https://gradle.org/wp-content/uploads/2015/03/GradleLogoReg.png). - Hack: Hack logo color (http://hacklang.org/wp-content/themes/hack/hack.png). - Haml: Haml logo color (http://haml.info/images/haml.png). - LLVM: Eye color of the dragon logo of LLVM (http://llvm.org/img/DragonMedium.png). - Less: Less logo color (http://lesscss.org/public/img/logo.png). - Markdown: The Daring Fireball logo color (http://daringfireball.net/graphics/logos/). - Maven POM: The maven logo color (https://en.wikipedia.org/wiki/Apache_Maven#/media/File:Maven_logo.svg). - Nginx: The nginx logo color (http://nginx.org/nginx.png). - NumPy: The NumPy logo color (http://www.numpy.org/_static/numpy_logo.png). - RDoc: I couldn'd find any logo, so have used the color of the name of RDoc in the official site (http://docs.seattlerb.org/rdoc/). - SCSS: The Sass logo color (http://sass-lang.com/assets/img/logos/logo-b6e1ef6e.svg). - Sass: The Sass logo color (http://sass-lang.com/assets/img/logos/logo-b6e1ef6e.svg). - XML: A random color. - XSLT: A random color. - YAML: The color of the name of YAML in the official site (http://yaml.org/). - Yacc: A random color. - reStructuredText: The official logo color (http://docutils.sourceforge.net/rst.png). --- lib/linguist/languages.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 4d83e963..ae0584a1 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -153,6 +153,7 @@ Ant Build System: - ant.xml - build.xml ace_mode: xml + color: "#A82C7C" ApacheConf: type: markup @@ -182,6 +183,7 @@ AppleScript: interpreters: - osascript ace_mode: applescript + color: "#F2F1F1" Arc: type: programming @@ -289,6 +291,7 @@ Batchfile: - .cmd tm_scope: source.dosbatch ace_mode: batchfile + color: "#92C2FF" Befunge: type: programming @@ -303,6 +306,7 @@ Bison: extensions: - .bison ace_mode: text + color: "#6A463F" BitBake: type: programming @@ -690,6 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text + color: "#00A818" Cuda: type: programming @@ -698,6 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp + color: "#76B900" Cycript: type: programming @@ -1204,6 +1210,7 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text + color: "#84BA40" Grammatical Framework: type: programming @@ -1355,6 +1362,7 @@ Hack: - .hh - .php tm_scope: text.html.php + color: "#878787" Haml: group: HTML @@ -1363,6 +1371,7 @@ Haml: - .haml - .haml.deface ace_mode: haml + color: "#ECE2A9" Handlebars: type: markup @@ -1705,6 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text + color: "#689DD7" LOLCODE: type: programming @@ -1768,6 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less + color: "#2A4D82" Lex: type: programming @@ -1977,6 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm + color: "#DDDDDD" Mask: type: markup @@ -2015,6 +2027,7 @@ Maven POM: filenames: - pom.xml ace_mode: xml + color: "#FF6804" Max: type: programming @@ -2204,6 +2217,7 @@ Nginx: aliases: - nginx configuration file ace_mode: text + color: "#009900" Nimrod: type: programming @@ -2262,6 +2276,7 @@ NumPy: - .numsc tm_scope: none ace_mode: text + color: "#378EC8" OCaml: type: programming @@ -2794,6 +2809,7 @@ RDoc: extensions: - .rdoc tm_scope: text.rdoc + color: "#333333" REALbasic: type: programming @@ -2991,6 +3007,7 @@ SCSS: ace_mode: scss extensions: - .scss + color: "#CF649A" SMT: type: programming @@ -3093,6 +3110,7 @@ Sass: extensions: - .sass ace_mode: sass + color: "#CF649A" Scala: type: programming @@ -3676,6 +3694,7 @@ XML: - Web.Release.config - Web.config - packages.config + color: "#25AAE2" XPages: type: programming @@ -3721,6 +3740,7 @@ XSLT: - .xsl tm_scope: text.xml.xsl ace_mode: xml + color: "#0E76BD" Xojo: type: programming @@ -3753,6 +3773,7 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml + color: "#FF0000" Yacc: type: programming @@ -3762,6 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text + color: "#92278F" Zephir: type: programming @@ -3844,6 +3866,7 @@ reStructuredText: - .rst - .rest ace_mode: text + color: "#000000" wisp: type: programming From 114a331106d8da31041657345277a160bc8f99c4 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Wed, 2 Sep 2015 07:04:51 +1000 Subject: [PATCH 032/227] Add ".topojson" as a JSON extension --- lib/linguist/languages.yml | 1 + samples/JSON/switzerland.topojson | 1 + 2 files changed, 2 insertions(+) create mode 100644 samples/JSON/switzerland.topojson diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 446c81c2..cc8a94ac 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1547,6 +1547,7 @@ JSON: - .json - .geojson - .lock + - .topojson filenames: - .jshintrc - composer.lock diff --git a/samples/JSON/switzerland.topojson b/samples/JSON/switzerland.topojson new file mode 100644 index 00000000..18ded47d --- /dev/null +++ b/samples/JSON/switzerland.topojson @@ -0,0 +1 @@ +{"type":"Topology","transform":{"scale":[0.00045364536453645373,0.00019901990199019923],"translate":[5.956,45.818]},"objects":{"cantons":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3,4,5,6,7,8,9]],"id":"ZH","properties":{"name":"Zürich"}},{"type":"MultiPolygon","arcs":[[[10,11,12,13,14,15,16,17,18,19,20,21,22],[23],[24]],[[25,26]],[[27]],[[28,29]]],"id":"BE","properties":{"name":"Bern/Berne"}},{"type":"Polygon","arcs":[[-12,30,31,32,33,34]],"id":"LU","properties":{"name":"Luzern"}},{"type":"Polygon","arcs":[[35,36,37,38,-16,39,40,41]],"id":"UR","properties":{"name":"Uri"}},{"type":"Polygon","arcs":[[42,-33,43,-1,44,45,46,-42]],"id":"SZ","properties":{"name":"Schwyz"}},{"type":"MultiPolygon","arcs":[[[-13,-35,47]],[[-15,48,-40]]],"id":"OW","properties":{"name":"Obwalden"}},{"type":"Polygon","arcs":[[-34,-43,-41,-49,-14,-48]],"id":"NW","properties":{"name":"Nidwalden"}},{"type":"Polygon","arcs":[[49,-36,-47,50,51]],"id":"GL","properties":{"name":"Glarus"}},{"type":"Polygon","arcs":[[-32,52,-2,-44]],"id":"ZG","properties":{"name":"Zug"}},{"type":"MultiPolygon","arcs":[[[53,54,55,-27,56,-19],[57]],[[58]],[[59,60]],[[61]],[[62]]],"id":"FR","properties":{"name":"Fribourg"}},{"type":"MultiPolygon","arcs":[[[-30,63,64,65,-23]],[[66]],[[67,68,69]],[[70,71]]],"id":"SO","properties":{"name":"Solothurn"}},{"type":"Polygon","arcs":[[72,73]],"id":"BS","properties":{"name":"Basel-Stadt"}},{"type":"MultiPolygon","arcs":[[[74,-70,75,-71,76,-73,77,78,-65]],[[79,80,-68]]],"id":"BL","properties":{"name":"Basel-Landschaft"}},{"type":"MultiPolygon","arcs":[[[-7,81,82,83]],[[84,85]],[[-5,86]]],"id":"SH","properties":{"name":"Schaffhausen"}},{"type":"Polygon","arcs":[[87,88,89,90,91,92]],"id":"AR","properties":{"name":"Appenzell Ausserrhoden"}},{"type":"MultiPolygon","arcs":[[[93,-92]],[[94,-90]],[[-88,95]]],"id":"AI","properties":{"name":"Appenzell Innerrhoden"}},{"type":"MultiPolygon","arcs":[[[-51,-45,-10,96,97,98,-52],[99],[-94,-91,-95,-89,-96,-93]],[[100]]],"id":"SG","properties":{"name":"St. Gallen"}},{"type":"Polygon","arcs":[[101,-37,-50,-99,102]],"id":"GR","properties":{"name":"Graubünden/Grigioni"}},{"type":"Polygon","arcs":[[-53,-31,-11,-66,-79,103,-3]],"id":"AG","properties":{"name":"Aargau"}},{"type":"MultiPolygon","arcs":[[[-9,104,-83,105,-85,106,-97],[-101]],[[107]]],"id":"TG","properties":{"name":"Thurgau"}},{"type":"Polygon","arcs":[[108,-38,-102,109],[110]],"id":"TI","properties":{"name":"Ticino"}},{"type":"MultiPolygon","arcs":[[[111,112,113,114,115,-61,116,-54,-18,117,118],[-62],[119],[120]],[[-26,-56,121,-20,-57]]],"id":"VD","properties":{"name":"Vaud"}},{"type":"Polygon","arcs":[[-118,-17,-39,-109,122]],"id":"VS","properties":{"name":"Valais/Wallis"}},{"type":"Polygon","arcs":[[-122,-55,-117,-60,-116,123,124,-21]],"id":"NE","properties":{"name":"Neuchâtel"}},{"type":"MultiPolygon","arcs":[[[-114,125]],[[126]],[[127]]],"id":"GE","properties":{"name":"Genève"}},{"type":"Polygon","arcs":[[-64,-29,-22,-125,128,-80,-75]],"id":"JU","properties":{"name":"Jura"}}]}},"arcs":[[[6286,7049],[-33,10],[-114,-55],[-60,-45],[-9,-15],[-13,10],[-2,-5],[0,-5],[0,-5],[0,-6],[-2,0],[-5,-5],[-4,0],[-5,0],[-2,0],[-2,0],[0,-5],[-20,-45],[-6,-10],[-3,-5],[-2,-25],[2,-10],[3,-15],[8,-10],[9,-10],[5,-15],[0,-15]],[[6031,6763],[-9,-5],[-9,0],[-13,-10],[-7,-10],[-20,5],[-8,5],[-3,25],[0,25],[-2,0],[-2,0],[-2,0],[-5,-5],[-2,0],[-2,0],[-2,5],[-3,0],[-4,-5],[-9,0],[-2,0],[-2,-5],[-2,0],[-5,0],[-2,5],[0,5],[-2,5],[-7,0],[-2,0],[-4,0],[-3,0],[-4,0],[-2,0],[-2,0],[-5,0],[-2,5],[-2,0],[0,10],[2,5],[0,5],[2,0],[2,5],[3,5],[0,5],[-5,5],[0,5],[-2,10],[-4,10],[-5,5],[0,5],[0,5],[0,5],[0,5],[-4,5],[-2,0],[0,5],[0,5],[0,5],[-3,5],[0,5],[-2,11],[-2,5],[-2,5],[-3,5],[-2,0],[-2,5],[-2,0],[0,5],[-5,5],[-4,0],[-2,0],[-2,-5],[-3,-5],[-2,0],[-2,-5],[-2,0],[-2,0],[-3,5],[-2,5],[0,5],[2,5],[-2,5],[2,5],[0,5],[-4,5],[0,5],[-2,5],[-2,0],[-3,0],[-2,0],[-2,0],[-4,5],[-3,0],[-2,-5],[-2,-5],[-2,0],[-2,0],[-3,0],[-2,10],[0,5],[0,5],[2,10],[0,5],[-2,0],[-2,0],[-2,0],[-5,0],[0,5],[-2,0],[0,-5],[-6,-5],[-3,5],[-26,10],[-7,5],[-9,10],[-2,-5],[-15,-5],[-7,5],[-9,5],[-6,-10],[-9,5],[-2,-20],[-2,0],[-7,5],[-7,0],[-2,0],[-2,5],[-2,0],[-3,-5],[-15,0],[-2,-20],[-5,5],[-4,-10],[-7,5],[3,-5],[-9,-10],[-9,0],[-2,0],[-16,-5],[-13,-15],[-9,5],[-8,5],[-7,-5],[2,10],[-7,5],[0,5],[-6,0],[-2,5],[-14,0],[-8,25],[-9,-5],[-2,10],[-5,0],[-4,0],[0,5],[-2,5],[-3,5],[-4,0],[-7,10],[-8,-5],[-18,5],[-16,-10],[0,5],[0,5],[-2,5],[-2,0],[-2,0],[0,5],[0,5],[-2,10],[0,15],[0,5],[-3,10],[0,5],[0,5],[-2,0],[-2,5],[0,6],[4,0],[0,5],[-2,5],[-2,5],[-2,5],[-2,15],[-3,5],[-2,0]],[[5411,7185],[-2,5],[-4,10],[-11,15],[0,5],[0,5],[0,5],[0,5],[2,0],[0,5],[2,0],[0,5],[-2,5],[0,5],[-2,5],[-3,0],[-2,5],[0,5],[-2,0],[2,5],[0,5],[0,5],[2,5],[3,10],[0,5],[-3,5],[0,5],[-11,10],[-2,5],[-2,5],[0,5],[-2,0],[0,5],[-2,21],[-3,10],[-4,10],[-2,10],[6,5],[11,-15],[16,15],[0,5],[24,5],[9,10],[6,15],[16,15],[-2,0],[6,25],[-2,0],[-2,5],[7,5],[0,20],[8,10],[0,5],[11,5],[0,10],[11,10],[7,16],[2,15],[-2,0],[9,15],[-2,0],[6,25],[-2,5],[-2,-10],[-5,5],[-2,-20],[-13,-5],[-4,-10],[-11,0],[-5,-10],[-4,5],[-9,5],[-29,-15],[-2,10],[-4,5],[0,10],[8,25],[-2,10],[0,5],[-2,0],[-2,5],[-5,5],[-4,5],[-7,10],[0,10],[-6,15],[6,25],[5,15],[-5,5],[3,20],[-7,21],[7,15],[-3,15],[-15,5],[2,15],[-2,5],[-7,5],[0,5],[-2,0],[2,5],[0,5],[0,5],[-2,0],[-4,5],[0,5],[2,10],[0,15],[0,15],[0,5],[2,5],[2,0],[0,10],[-2,0],[-2,-5],[0,5],[-7,10],[-4,-5],[-2,0],[-11,0],[-3,-5],[-6,30],[-5,0],[-8,-5],[-18,0],[-7,10],[-2,6],[9,0],[2,-6],[5,11],[15,10],[2,-5],[2,-5],[3,-5],[6,10],[7,10],[-7,10],[-2,15],[9,15],[-7,10],[5,10],[6,-10],[11,20],[0,10],[-2,10],[-2,5],[-4,10],[0,5],[-7,0],[-2,0],[-5,5],[-6,0],[-5,0],[-4,5],[0,5],[0,5],[4,10],[5,-5],[2,0],[6,0],[3,10],[2,10],[-2,15],[-5,5],[-2,31],[2,0],[0,5],[5,5],[6,0],[-9,35],[-6,0],[-2,15],[-14,0],[-8,30],[-7,5],[0,5],[4,5],[0,5],[-4,5],[4,0],[9,0],[7,5],[-2,20],[-3,30],[-19,0],[-5,26],[2,25],[-4,25],[-7,5],[9,10],[2,10],[-8,0],[-3,5],[3,10],[0,10],[6,10],[-2,10],[4,5],[5,0],[2,0],[2,5],[2,-5],[0,5],[-2,0],[5,0],[4,-5],[2,5],[5,-5],[2,5],[4,0],[7,15],[-2,5],[2,0],[2,46],[7,15],[6,5],[7,-10],[-2,-5],[6,-5],[3,5],[6,10],[-2,15],[2,5],[16,5],[2,10],[-7,25],[7,-10],[4,10],[-2,10],[4,0],[3,10],[6,10],[16,0],[-7,10],[4,10],[-4,10],[-2,10],[9,20],[0,15],[-3,0],[3,15],[17,21]],[[5444,8793],[2,-5],[3,0],[2,0],[2,0],[5,0],[2,0],[6,0],[3,0],[2,0],[2,0],[2,5],[2,0],[5,5],[4,0],[2,5],[3,0],[8,5],[5,5],[2,0],[2,0],[2,0],[3,0],[4,0],[4,0],[3,0],[2,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,5],[2,0],[2,5],[3,0],[0,5],[4,0],[0,5],[2,0],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[3,0],[2,5],[2,0],[2,5],[2,5],[5,0],[0,5],[2,0],[4,0],[-2,10],[-11,25],[-4,-5],[-9,0],[-2,0],[0,-5],[-2,-5],[-3,0],[-2,0],[-2,0],[-2,0],[-5,0],[-2,0],[-2,-5],[-2,5],[-3,0],[-2,0],[0,-5],[-2,0],[-2,0],[-2,0],[-5,20],[-4,0],[-7,0],[2,15],[0,10],[-4,15],[-4,5],[-3,15],[3,10],[6,0],[7,0],[6,5],[5,5],[0,6],[4,0],[2,10],[-2,5],[9,0],[2,0],[7,15],[0,5],[2,5],[-2,5],[2,5],[2,0],[3,-5],[4,0],[2,0],[2,5],[3,0],[0,-5],[2,0],[2,5],[2,0],[2,0],[5,0],[2,0],[0,-5],[2,0],[0,5],[2,0],[3,0],[2,0],[2,5],[2,0],[7,5],[2,0],[2,0],[5,0],[4,5],[-2,0],[2,0],[0,20],[-2,10],[9,-5],[4,0],[4,0],[0,10],[-4,0],[0,5],[0,5],[2,-5],[2,5],[0,5],[3,0],[-3,5],[0,10],[3,5],[0,10],[2,0],[9,0],[11,-10],[9,0],[4,0],[4,-5],[5,0],[4,0],[2,0],[0,-15],[0,-10],[9,5],[2,-10],[7,5],[4,-5],[5,0],[4,0],[9,0],[2,-5],[2,-5],[0,-5],[5,-5],[0,-5],[2,-5],[0,-5],[2,-5],[11,0],[3,0],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[7,0],[-3,-5],[-6,0],[-9,-5],[0,-15],[0,-10],[-5,-11],[-6,-10],[4,-5],[0,-5]],[[5746,8948],[-13,-10],[-2,-5],[0,-10],[-13,-10],[-5,5],[-6,-5],[-16,-20],[-6,-5],[4,-20],[-7,0],[0,-10],[5,0],[0,-10],[9,-5],[-5,0],[-6,-15],[11,-5],[11,5],[2,-5],[0,-15],[-9,-5],[2,-5],[5,-5],[6,-15],[2,-6],[3,-10],[0,-10],[2,-5],[0,-5],[0,-5],[4,-10],[5,-10],[2,-5],[4,0],[2,5],[3,0],[2,5],[2,10],[4,10],[0,5],[3,5],[2,5],[2,5],[2,5],[0,5],[3,6],[0,5],[2,5],[0,5],[0,15],[0,5],[4,10],[0,5],[2,0],[3,5],[4,0],[2,0],[5,0],[2,0],[0,5],[2,5],[-2,0],[0,5],[-2,10],[-5,15],[0,5],[0,10],[2,5],[0,5],[3,5],[4,5],[2,5],[2,5],[5,5],[4,0],[5,5],[4,0],[4,5],[3,0],[2,5],[0,5],[-2,10],[0,10],[2,0],[0,10],[2,11]],[[5819,8984],[0,5],[2,0],[2,0],[3,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,5],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[-2,0],[0,5],[-3,5],[-2,5],[0,5],[-2,0],[0,5],[-2,5],[0,5],[-2,5],[0,5],[-3,5],[-2,10],[0,5],[0,5],[0,5],[0,5],[0,15],[-2,5],[0,5],[0,5],[-2,0],[0,5],[0,5],[0,5],[0,5],[2,0],[0,5],[2,0],[7,5],[2,0],[0,6],[2,0],[0,5],[2,0],[0,5],[0,5],[0,5],[3,5],[2,5],[2,0],[2,5],[0,-5],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,-5],[0,-5],[3,0],[0,-5],[0,-5],[0,-6],[0,-5],[-3,-5],[-2,0],[0,-5],[-2,0],[-2,0],[-2,0],[-3,0],[-2,0],[-2,0],[-2,0],[-2,0],[0,-5],[-3,0],[0,-5],[0,-5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,5],[2,0],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[2,5],[3,5],[2,0],[0,5],[2,5],[0,5],[2,0],[0,5],[2,6],[0,5],[3,5],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[-2,0],[-3,5],[-4,10],[-2,0],[-2,5],[-3,5],[-2,5],[-4,0],[-2,5],[-3,0],[-2,5],[-4,5],[-3,-5],[-4,5],[-2,5],[-2,0],[0,5],[-3,0],[0,5],[-2,5],[0,5],[-2,10]],[[5841,9300],[2,0],[2,15],[5,0],[0,5],[2,10],[0,5],[4,5],[3,0],[0,5],[2,0],[4,-5],[0,-5],[3,0],[0,-5],[2,0],[4,0],[7,5],[2,0],[2,5],[2,5],[0,5],[0,5],[0,10],[-2,15],[-2,11],[-2,5],[0,15],[2,0],[0,5],[2,0],[5,0],[4,5],[2,0],[2,0],[5,0],[6,0],[3,0],[4,5],[7,5],[2,0],[2,-5],[2,0],[2,-5],[5,-5],[4,0],[2,-5],[9,-15],[5,-5],[6,-6],[5,0]],[[5967,9385],[2,0],[2,-5],[2,5],[3,-5],[2,0],[2,0],[2,0]],[[5982,9380],[-4,-35],[0,-10],[4,-5],[16,-15],[2,-15],[2,-10],[-2,-5],[0,-10],[4,-20],[2,-15],[9,-10],[5,-15],[4,-15],[11,-5],[13,-5],[7,-11],[13,-15],[5,10],[6,0],[2,-5],[3,0],[2,-5],[6,-5],[5,0],[9,10],[13,-5],[4,0],[9,0],[11,5],[2,-15],[7,-5],[4,10],[20,10],[5,16],[4,0],[7,15],[8,5],[9,0],[5,-5],[2,0],[4,10],[9,5],[9,15],[0,15],[2,15],[4,20],[9,0],[14,0],[8,0],[5,0],[-2,-5],[0,-15],[2,-5],[-2,-25],[2,-15],[11,0],[11,-10],[15,-5],[9,-10],[0,-16],[2,-10],[2,-10],[-6,-15],[-2,-15],[2,0],[-7,-10],[-4,-15],[-5,5],[0,-10],[-4,5],[-2,-5],[-5,-5],[3,-10],[-5,-10],[7,-10],[-7,-10],[5,-10],[-11,-10],[0,-5],[-9,0],[-2,-30],[-5,-26],[2,-5],[0,-5],[-4,5],[-7,0],[-6,0],[-14,5],[0,21],[3,5],[-5,10],[-20,15],[-6,0],[-2,10],[-11,0],[-18,15],[-9,0],[-2,-5],[-13,15],[-5,5],[-2,10],[-4,-5],[0,-45],[-5,0],[-4,-5],[-5,0],[-2,-20],[7,-5],[4,-21],[5,-15],[6,0],[-6,-15],[2,-5],[2,-20],[2,0],[5,5],[6,0],[3,0],[4,0],[9,0],[2,0],[4,0],[9,-5],[2,0],[3,0],[6,-5],[7,-5],[4,0],[0,-5],[2,0],[3,0],[2,0],[4,-5],[5,0],[19,-10],[9,-5],[18,-10],[0,-5],[-9,5],[-2,-10],[11,-5],[-2,-25],[6,-5],[-2,-10],[7,-5],[15,-5],[2,10],[5,-5],[0,5],[4,0],[0,5],[18,-10],[0,10],[2,5],[18,-15],[-3,-10],[3,0],[0,-20],[13,5],[-2,-16],[15,5],[0,-15],[-13,0],[-7,-5],[-6,-15],[-22,5],[2,-10],[-5,0],[5,-15],[2,-5],[-2,0],[2,-10],[2,-5],[0,-5],[5,-25],[4,0],[11,-30],[0,-20],[18,-10],[11,5],[4,-5],[13,0],[14,-5],[6,0],[7,-5],[6,-5],[7,-5],[0,5],[7,5],[6,-5],[5,0],[4,-5],[13,-5],[7,-10],[-4,-16],[-5,-10],[5,-5],[-3,-25],[5,-10],[-2,-30],[-5,-10],[-4,-10],[0,-30],[0,-5],[0,-5],[0,-5],[0,-20],[9,0],[0,-15],[-14,-11],[-13,-5],[0,-25],[-9,-10],[7,-5],[0,-20],[15,-5],[0,-5],[3,-10],[2,-5],[-2,0],[0,-5],[2,0],[6,-5],[0,-10],[0,-5],[0,-5],[5,-5],[4,-20],[9,-5],[11,-25],[-13,-20],[9,-26],[8,-10],[16,-5],[9,-5],[8,0],[3,0],[13,5],[0,-10],[-5,-10],[-8,-5],[-11,10],[-7,0],[-2,-5],[-2,5],[-9,-5],[-2,10],[-3,0],[-6,-15],[0,-5],[2,0],[9,-10],[0,-5],[-2,-5],[0,-5],[-3,-10],[9,-20],[-4,-10],[-2,-10],[2,-10],[-18,-40],[-2,-15],[2,0],[2,-6],[5,0],[4,6],[2,0],[3,-6],[2,0],[2,0],[4,-5],[5,0],[4,0],[5,-5],[4,-5],[2,-5],[2,0],[3,-5],[2,-5],[2,-5],[4,-10],[3,-5],[4,0],[5,-5],[4,-5],[9,-10],[2,-5],[2,-5],[0,-5],[-2,-5],[-4,-10],[-3,-5],[3,-5],[2,-5],[4,-10]],[[6586,7828],[2,-5],[5,0],[2,0],[0,-5],[2,-5],[2,0],[3,-5],[2,-5],[0,-15],[2,-5],[4,-10],[0,-10],[5,-11],[2,-10],[2,-5],[2,-5],[3,-5],[-3,-5],[0,-5],[3,0],[2,0],[2,0],[2,0],[5,0],[2,0],[6,-10],[5,0],[4,-20],[-2,-40],[13,-10],[-4,-30],[0,-25],[18,-41],[-23,-60],[-11,-5],[-6,0],[-7,0],[-15,-5],[-9,-30],[-2,-5],[0,-5],[-7,-15],[0,-10],[-4,0],[-2,-5],[-3,0],[-2,0],[-2,5],[-2,-5],[-2,0],[0,-5],[-5,0],[-2,-5],[-2,5],[-2,-5],[-3,0],[-2,0],[0,-5],[16,-20],[2,-10],[-2,-11],[6,0],[5,11],[4,0],[0,-16],[0,-5],[0,-10],[-2,-5],[-5,-5],[-2,-5],[-2,0],[-2,0],[-2,-5],[6,-15],[-2,-10],[-7,0],[3,-5],[-7,-10],[-4,-15],[-5,-5],[-2,-5],[-9,5],[-2,-5],[-35,-20],[-9,-5],[0,15],[-7,-10],[-13,0],[-4,-5],[-27,-5],[-26,-5],[2,-20],[-9,-5],[0,-10],[-7,-5],[-2,5],[-11,-10],[-2,5],[-2,0],[-2,0],[-3,5],[-2,0],[0,-5],[-2,5],[-2,0],[0,5],[-2,5],[0,5],[0,5],[-3,0],[0,10],[-15,-10],[0,-10],[-16,0],[-4,10],[-7,5],[-6,0],[-2,0],[-3,0],[-4,5],[-37,-15],[-14,-5],[-2,-10],[-6,-10],[0,-5],[-5,0],[-2,-16],[26,-90]],[[4119,7275],[0,-5],[7,-5],[-2,-5],[2,0],[-2,-5],[0,-5],[4,0],[2,-5],[-4,-5],[2,-15],[-2,-5],[2,0],[-2,-5],[-4,-5],[-3,-5],[5,-5],[2,0],[-2,-5],[-2,-5],[0,-5],[0,-5],[0,-5],[2,-5],[2,0],[0,-5],[0,-5],[4,0],[0,-5],[3,-5],[2,-5],[2,0],[2,-11],[5,-5],[6,-15]],[[4150,7114],[-4,-5],[0,-5],[0,-10],[-2,0],[2,-5],[0,-10],[0,-5],[0,-10],[7,-5],[2,-5],[4,-10],[2,-10],[3,0],[2,-5],[2,0],[0,-5],[0,-5],[0,-5],[2,-5],[2,-10],[0,-5],[3,-5],[2,-5],[2,-5],[2,-5],[2,-5],[-2,-5],[2,-5],[3,-5],[2,-5],[2,-5],[7,-5],[-3,-6],[3,-15],[0,-5],[-3,-5],[3,-5],[4,0],[2,0],[0,-10],[5,0],[0,-5],[0,-5],[4,0],[4,-10],[14,-10],[2,-5],[0,-5],[4,-10],[2,-5],[3,-5],[-3,-5],[3,-5],[0,-5],[4,-5],[2,-5],[-2,-5],[-4,-10],[-3,0],[-2,-10],[-2,-5],[-2,-5],[-2,-20],[2,-10],[0,-16],[2,-10],[0,-10],[2,-10],[5,-10],[2,-10],[4,0],[9,-15],[7,-15],[0,-10],[0,-20],[-5,-5],[5,-10],[-9,0],[0,-15],[0,-5],[-7,0],[-22,-15],[2,-10],[-6,-5],[-5,-5],[-2,-5],[0,-10],[0,-6],[7,0],[-5,-25],[14,-10],[-5,-25],[0,-10],[5,5],[2,-10],[-5,-20],[11,-10],[3,-10],[-5,-5],[5,-10],[2,-5],[2,-5],[-2,-15],[-5,-20],[5,0],[-5,-10],[-4,0],[4,-5],[-2,-26],[-4,-5],[2,-10],[-9,-25],[-4,-10],[0,-5],[2,0],[2,0],[2,-5],[-2,-5],[-2,-5],[-7,-10],[-2,-10],[-4,-15],[4,-5],[-2,-10],[2,-5],[0,-5],[2,-5],[-2,0],[7,-5],[2,-5],[7,-20],[4,0],[7,-5],[4,5],[5,-20],[-3,-11],[5,-10],[15,-15],[5,-10],[-3,-15],[5,-15],[11,-20],[0,-5],[-5,-15],[-2,-5],[5,-20],[6,-15],[7,5],[6,0],[5,5],[9,5],[4,0],[9,10],[6,0],[5,-5],[7,-20],[4,-5],[7,-5],[15,5],[2,0],[9,0],[7,5],[8,0],[9,-15],[-4,-5],[-5,-25],[-8,-16],[4,-35],[4,-30],[-17,-20],[2,-35],[2,-5],[-13,-20],[-9,-5],[-9,-10],[0,-56],[-6,-15],[-7,0],[-9,-5],[-2,-25],[-13,-35],[-7,-10],[-9,0],[-22,10],[-6,-5],[-5,-5],[-4,-5],[-2,0],[-5,-5],[-4,-5],[-11,-5],[0,-5],[-7,0],[-4,-5],[-2,-5],[-3,0],[-2,-5],[0,-5],[-2,0],[-2,-10],[-2,-10],[0,-5],[0,-5],[-3,0],[-2,-5],[0,-5],[-2,0],[0,-5],[0,-6],[2,0],[11,-5],[2,-5],[0,-5],[3,0],[2,0],[4,0],[2,0],[3,0],[4,-15],[2,0],[0,-5],[0,-15],[-6,-15],[0,-5],[4,0],[-9,-5],[-6,-15],[-5,-20],[0,-10],[-6,-5],[-5,-10],[-20,-10],[-6,-20],[4,-30],[0,-11],[-2,-10],[15,-10],[3,-15],[11,-10],[-7,-25],[2,-20],[-2,-20],[7,-20],[0,-15],[15,-35],[42,-31],[57,-55],[55,-75],[9,-25],[2,-10],[5,-10],[0,-5],[-2,-5],[2,-11],[4,-5],[2,-5],[3,0],[4,-5],[2,0],[2,-5],[3,-5],[2,0],[2,0],[2,-5],[2,0],[3,-5],[2,0],[0,-5],[0,-5],[2,-5],[2,-5],[7,-15],[13,-5],[9,-10],[20,20],[11,15],[15,10],[36,25],[22,5],[17,-10],[18,-5],[4,5]],[[4613,4873],[5,0],[8,0],[5,0],[6,-10],[20,15],[14,-10],[8,0],[7,0],[18,5],[2,-20],[13,-25],[7,-5],[4,-20],[7,-5],[20,0],[11,-10],[6,-5],[53,-75],[29,20],[20,35],[8,-10],[40,30],[13,-10],[27,5],[9,-15],[15,-15],[7,-10],[26,5],[11,40],[44,-30],[11,-20],[11,-30],[16,5],[15,-10],[18,25],[11,5],[4,15],[9,0],[31,40],[13,20],[24,35],[60,10],[9,5],[0,10],[11,10]],[[5319,4873],[4,0],[13,-10],[7,-15],[15,-25],[11,0],[7,-30]],[[5376,4793],[2,-35],[11,10],[16,15],[13,20],[9,0],[6,-5],[5,-10],[8,0],[0,5],[12,0],[11,0],[13,-10],[9,0],[0,-5],[-3,-10],[5,-10],[2,0]],[[5495,4758],[-7,-40],[-4,-15],[-7,5],[-4,-10],[7,-16],[2,-15],[-5,-20],[0,-30],[20,-35],[-6,-15],[2,-45],[-2,-15],[4,-15],[11,-6],[0,-15],[-4,-20],[6,-25],[0,-5],[-4,-20],[-2,-25],[-14,-10],[-11,-5],[-17,5],[-11,-5],[-18,5],[-4,0],[-7,0],[0,10],[-7,10],[-8,-5],[-18,15],[-2,-15],[2,-10],[-7,-20],[5,-20],[-2,-25],[0,-5],[6,-5],[2,-21],[14,-10],[4,-70]],[[5409,4195],[-24,5],[-9,-40],[-9,-10],[-24,-50],[-13,-5],[-3,0],[-8,-21],[-3,-20],[0,-25],[7,-5],[0,-25],[-7,-25],[-6,-25],[-7,-15],[-2,-15],[7,-30],[-7,-31],[9,-15],[-9,-25],[-20,-30],[-4,-15],[-16,-25],[-13,-15],[-44,-10],[-9,-25],[0,-10],[-22,-31],[-20,-5],[-15,-10],[-9,-25],[-9,-5],[-11,-5],[-11,-5],[-11,-10],[-13,-20],[-13,0],[-25,-10],[-8,0],[-14,0],[-11,0],[-15,-5],[-18,-5],[-13,-5],[-11,0],[-18,-5],[-15,-10],[-9,0],[-4,10],[-9,5],[-4,15],[4,15],[-2,5],[-11,0],[-13,5],[-9,-5],[-9,0],[-11,5],[-35,20],[-18,5],[-9,20],[-9,10],[-8,20],[-20,5],[-9,0],[-11,5],[-5,11],[-19,5],[-14,10],[-6,10],[-11,-10],[-18,-5],[-4,-10],[-16,25],[-24,5],[-18,15],[-2,10],[-9,0],[-11,0],[-20,5],[-33,-25],[-8,0],[-9,-10],[0,-10],[-16,-31],[-11,0],[-2,0],[-4,-5],[-5,0],[-13,-10],[-4,-20],[-11,-10],[0,-10],[4,-10],[4,-15],[-2,-5],[7,-10],[0,-10],[9,-15],[-7,-15],[2,-20],[-6,-20],[-7,0],[-24,-26],[-7,6],[-20,-6],[-15,-25],[-4,-25],[-11,-5],[-9,-10],[2,-10],[-5,-5],[-17,-5],[-9,-20],[-11,0],[-2,-5],[-9,-5],[-7,-10],[-6,-5],[-9,5],[-9,-10],[-22,-10],[-18,-5],[-13,0],[-28,0],[-7,5],[-9,-5],[-35,-40],[-7,-16],[-26,-20],[-7,-5],[-6,-5],[-18,-15],[-11,-20],[-11,-10],[-7,-15],[-11,-10],[-4,-20],[-13,-5],[-9,-10],[-5,0],[-11,-20],[-11,-5],[-2,-10],[-24,-25],[-5,-11],[-13,-10],[-9,-10],[-17,-5],[-9,-5],[-9,-25],[-9,-5],[-6,0],[-9,10],[-4,10],[-11,10],[-12,25],[-6,0],[-27,21],[-33,20],[-50,35],[-31,25],[-5,-10],[-2,-15],[-4,-10],[-9,0],[-15,-5],[-3,-10],[0,-15],[3,-15],[-9,-26],[-7,-5],[-7,0],[-4,-10],[4,-20],[0,-10],[-6,-5],[-7,-15],[-17,15],[-7,15],[-13,0],[-11,-10],[-13,-5],[-7,-5],[-2,-5],[-5,10],[-11,0],[-13,-10],[-20,0],[-13,-10],[-2,-15],[-9,-35],[26,-25],[14,-5],[17,-25],[-31,-26],[-6,-35],[-27,-15],[-42,10],[-11,-30],[-6,0],[-11,10],[-9,-10],[-7,5],[-4,5],[2,15],[-4,35],[-11,15],[-11,-5],[-2,-15],[-7,-15],[-13,0],[-5,-10],[-6,15],[0,5],[-5,10],[-31,5],[-11,15],[-8,-5],[-14,-20],[-24,-5],[-4,-5],[-25,-15],[-4,-10],[-4,15],[-16,-20],[-11,-20],[-4,0],[-9,-20],[-2,-5],[-7,5],[-9,-20],[-13,-15],[-11,-5],[-9,-20],[-11,-15],[-13,5],[-24,-20],[-29,-16],[-20,0],[-9,21],[-6,20],[0,10],[4,10],[-4,10],[2,5],[2,5],[5,15],[2,35],[-7,25],[-24,-40],[-9,-5],[-9,5],[-15,-10],[-49,-35],[0,-15],[0,-35],[-4,-21],[4,-30],[-4,-5],[-9,-20],[-6,-10],[-7,-5],[-7,-5],[-6,-5],[-22,-5],[-29,10]],[[2788,2567],[4,101],[-8,40],[2,0],[2,5],[4,5],[3,0],[2,0],[2,0],[2,0],[0,5],[2,5],[5,5],[-5,0],[-4,15],[-15,-15],[-7,0],[-13,40],[0,5],[-2,5],[-5,10],[0,5],[0,10],[0,5],[2,0],[0,5],[-4,0],[-9,0],[-17,0],[2,25],[6,26],[3,10],[4,10],[4,20],[5,15],[6,15],[-2,25],[7,40],[-7,25],[-9,10],[-6,10],[-2,21],[-14,25],[5,35],[15,0],[7,-10],[17,5],[22,10],[5,10],[2,10],[0,20],[0,10],[13,10],[-11,15],[7,15],[-2,5],[4,25],[-9,31],[0,10],[-4,15],[-2,50],[6,-5],[2,0],[5,5],[13,5],[0,25],[-7,10],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[2,5],[0,5],[2,5],[3,5],[2,0],[0,5],[0,5],[0,5],[0,5],[0,5],[2,0],[2,5],[2,5],[-2,0],[0,5],[0,6],[2,0],[0,5],[3,5],[0,5],[-3,5],[0,5],[0,5],[3,5],[2,10],[0,20],[-2,0],[0,5],[0,5],[0,10],[0,5],[-3,5],[0,5],[0,5],[0,5],[-2,0],[0,5],[-2,0],[0,5],[0,5],[2,10],[0,5],[0,5],[-2,5],[-2,5],[-2,5],[-3,5],[-6,15],[-5,5],[0,41]],[[2823,3698],[7,0],[13,10],[11,15],[9,5],[11,15],[18,55],[11,20],[8,15],[3,5],[6,5],[2,10],[9,-15],[9,-5],[5,0],[4,-5],[2,0],[2,0],[0,-5],[3,0],[4,0],[20,10],[11,40],[17,16],[-13,40],[7,80],[0,15],[-13,15],[2,76],[20,0],[8,10],[9,15],[-4,20],[-16,45],[3,0],[50,0],[11,-20],[-2,-10],[7,-10],[6,0],[3,-10],[-3,-15],[3,-15],[2,0],[4,25],[9,15],[7,10],[22,35],[-18,-5],[4,15],[3,20],[0,10],[2,15],[0,10],[9,31],[0,5],[-7,20],[11,20],[-4,20],[9,10],[-7,15],[-18,0],[-9,10],[-4,20],[-7,-5],[-33,5],[0,5],[0,5],[3,5],[2,5],[2,0],[0,10],[2,0],[0,5],[0,5],[2,5],[0,5],[-2,10],[0,6],[-2,5],[-4,0],[-3,0],[-2,0],[-4,5],[-7,0],[-2,0],[-4,0],[-7,5],[-2,0],[-2,0],[-3,5],[-4,0],[-2,5],[-3,0],[-2,0],[-4,0],[-2,0],[-5,0],[-2,0],[-2,0],[-9,0],[-7,5],[-2,0],[-2,0],[0,-5],[-2,0],[-5,5],[-2,0],[0,5],[-2,0],[0,5],[-4,5],[-3,5],[-2,0],[-4,5],[0,5],[0,5],[-2,10],[-3,10],[0,5],[0,5],[0,10],[0,20],[16,50],[2,15],[-2,5],[0,11],[0,5],[0,25],[0,5],[-5,5],[0,15],[-2,0],[-2,0],[-2,0],[2,5],[-2,5],[-7,0],[0,5],[-2,0],[0,5],[-2,5],[0,5],[0,5],[-2,5],[-3,0],[-2,0],[0,5],[5,5],[4,5],[2,5],[2,0],[0,5],[3,5],[2,0],[2,5],[4,5],[-2,0],[0,5],[2,5],[3,0],[2,5],[2,0],[0,5],[0,5],[-2,0],[-2,0],[0,5],[0,5],[0,5],[2,5],[0,5],[-2,5],[0,5],[0,6],[0,5],[2,5],[4,5],[2,0],[0,5],[0,5],[3,0],[0,5],[0,5],[2,5],[0,5],[2,5],[0,5],[0,5],[0,5],[2,5],[2,0],[0,10],[0,5],[3,0],[2,0],[2,5],[4,5],[0,5],[3,0],[2,5],[2,0],[2,5],[2,0],[0,5],[-4,5],[0,5],[4,5],[0,5],[0,10],[0,5],[-2,5],[0,5],[0,5],[2,0],[0,5],[5,5],[11,5],[2,0],[0,5],[5,10],[0,11],[-3,0],[0,5],[-15,30],[-33,30],[-5,15],[-8,10],[22,20],[0,15],[4,0],[-2,10],[2,0],[4,10],[5,-5],[-2,-5],[6,0],[9,0],[16,-15],[-7,-10],[-5,5],[-6,-10],[6,-15],[12,-5],[6,5],[2,-10],[5,5],[0,-5],[2,0],[0,5],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[2,5],[3,0],[2,5],[2,0],[4,0],[3,0],[2,0],[0,5],[0,5],[2,5],[2,0],[0,5],[0,5],[2,5],[3,0],[4,5],[2,5],[0,5],[0,5],[-2,10],[0,5],[0,10],[0,5],[-2,0],[-2,5],[-3,0],[-2,5],[-2,5],[0,6],[-2,10],[0,5],[2,5],[0,10],[0,5],[0,5],[0,15],[2,5],[-2,5],[-2,5],[-7,5],[-17,10],[-7,0],[-7,5],[-2,0],[-2,0],[-2,5],[-5,0],[-4,5],[-2,0],[-3,0],[-2,0],[-4,0],[-2,0],[-3,0],[-4,-5],[-9,0],[-2,0],[-11,0],[-4,0],[-3,0],[-11,0],[-4,0],[-2,5],[-5,0],[-2,0],[-11,0],[-2,0],[-2,-5],[-2,0],[-3,0],[-4,-10],[-2,-5],[-5,0],[-2,0],[-4,0],[-3,5],[-4,0],[-2,5],[-5,5],[-2,0],[-2,0],[-2,0],[-2,0],[-3,5],[-2,0],[-6,10],[-3,5],[-2,0],[-2,5],[-4,0],[-3,0],[-2,0],[-4,5],[-2,0],[-3,0],[-2,0],[-4,0],[-2,0],[-5,5],[-2,0],[-2,0],[-2,-10],[-14,0],[-4,5],[-5,0],[-6,25],[-11,-5],[-5,0],[-4,-10],[-9,-15],[-11,20],[-9,5],[-17,-5],[-11,-15],[-16,5],[9,10],[2,5],[14,5],[19,25],[-4,20],[0,11],[2,5],[0,5],[0,10],[-2,5],[0,5],[-2,5],[2,0],[0,15],[11,0],[0,10],[4,5],[-2,15],[-4,0],[-2,10],[-14,20],[3,5],[-3,10],[16,15],[0,10],[0,5],[0,15],[-5,0],[0,10],[3,10],[0,5],[2,5],[2,6],[0,5],[-4,5],[-5,15],[-15,-5],[-7,5],[-4,5],[0,10],[4,0],[5,0],[17,0],[2,20],[14,-5],[2,20],[4,0],[0,10],[13,10],[-4,5],[13,15],[7,10],[4,10],[5,5],[4,5],[-2,10],[-13,15],[0,5],[-9,10],[-5,0],[3,5],[6,16],[-2,10],[-7,-5],[-2,20],[-11,25],[-4,-10],[-5,10],[-6,-15],[-11,10],[-11,-20],[-9,0],[2,-10],[-22,-15],[-18,-16],[-17,-15],[-22,-15],[-16,-10],[-15,-5],[-20,-10],[-97,-35],[-4,5],[-5,0],[-70,0],[-14,0]],[[2415,5823],[-26,15]],[[2389,5838],[-33,131],[2,0],[2,10],[5,10],[2,0],[4,15],[0,5],[5,15],[0,5],[0,10],[-2,20],[0,25],[0,10],[2,5],[6,15],[5,11],[26,30],[7,0],[2,5],[18,0],[6,5],[7,10],[2,5],[2,0],[3,5],[2,0],[2,5],[2,0],[5,5],[22,30],[4,10],[-4,10],[0,5],[-5,5],[-2,5],[-4,5],[0,5],[0,5],[-3,0],[-2,0],[0,10],[2,5],[0,10],[0,5],[-2,5],[-2,0],[-2,5],[-2,5],[22,31],[0,20],[-7,10],[-18,40],[-28,20],[-13,0],[-18,25],[-18,20],[-26,-25],[-13,40],[19,41],[18,20],[-4,15],[-18,0],[-9,-15],[-33,-5],[-7,5],[-24,-25],[-28,-11],[-27,-10],[-44,-10],[-9,-5],[-17,-15],[-3,5],[-6,-5],[-13,20],[-7,-20],[-20,-20],[-35,-35],[-35,-30],[-42,-35],[8,85],[23,30],[11,81],[6,35],[-62,176]],[[1994,6773],[5,10],[20,30],[11,-65],[4,-10],[2,-11],[-2,-5],[2,-10],[5,-5],[4,-15],[20,20],[29,15],[6,11],[16,20],[37,40],[11,20],[5,25],[2,25],[9,0],[15,10],[9,-15],[-7,-5],[7,-10],[11,5],[20,-5],[15,-30],[7,-5],[9,10],[6,10],[7,30],[11,15],[0,10],[2,20],[44,10],[16,5],[6,10],[9,21],[9,30],[2,10],[4,15],[16,45],[0,5],[6,20],[11,5],[16,15],[-7,30],[3,21],[2,5],[13,10],[9,0],[24,20],[2,-25],[11,10],[5,-5],[4,-10],[-7,-10],[5,-16],[17,0],[5,16],[9,15],[4,0],[5,0],[6,-5],[5,0],[4,0],[13,10],[22,5],[24,-10],[3,10],[11,0],[11,5],[4,5],[7,5],[-7,15],[-9,15],[7,5],[0,5],[-9,0],[-11,0],[0,20],[7,0],[2,5],[4,5],[0,5],[-4,0],[-2,10],[6,20],[5,5],[22,10],[17,15],[-2,31],[0,10],[5,0],[-3,15],[-8,0],[0,10],[8,15],[-13,10],[2,5],[11,5],[11,-5],[45,10],[26,0],[7,-5],[-7,-15],[9,-15],[6,5],[5,0],[20,-10],[17,0],[25,-15],[33,5],[0,5],[8,0],[7,0],[7,-5],[13,-10],[13,0],[13,5],[0,5],[14,0],[22,10],[11,0],[22,10],[13,30],[20,20],[11,25],[24,0],[4,0],[11,5],[22,15],[22,25],[7,5],[5,-5],[22,-5],[4,0],[31,0],[13,0],[2,-15],[16,-5],[2,-10],[11,5],[9,-5],[22,5],[4,5],[40,-10],[31,0],[4,0],[5,-10],[17,-15],[9,0],[15,5],[7,0],[2,5],[20,15],[27,35],[17,10],[42,20],[20,11]],[[3531,7557],[-22,-31],[0,-10],[-2,-40],[-18,-20],[2,-15],[-4,-10],[-13,-15],[-25,0],[-13,-5],[-44,-25],[0,-5],[-18,-15],[-4,0],[-15,-31],[-14,-40],[-9,-25],[-4,0],[-4,0],[-14,-5],[-13,-5],[-13,0],[-13,0],[-11,-15],[-18,-20],[-18,-5],[-6,-15],[2,-15],[2,-20],[7,-10],[-13,-15],[-7,5],[-7,-5],[-15,-26],[-9,-5],[-35,-25],[-11,-10],[-31,-35],[-4,0],[-5,0],[-2,0],[-2,5],[-5,0],[-33,-15],[11,-55],[5,0],[15,-76],[27,10],[4,-15],[15,-10],[7,-10],[7,-15],[24,-90],[-4,0],[-11,0],[-7,-5],[0,-5],[2,-15],[0,-5],[5,0],[4,0],[2,0],[2,0],[0,5],[3,0],[4,0],[2,-5],[2,5],[3,0],[8,10],[3,0],[2,0],[4,0],[5,0],[11,-5],[2,0],[4,5],[5,5],[2,5],[0,10],[2,10],[2,10],[2,0],[3,5],[2,0],[2,0],[5,5],[4,0],[4,5],[5,5],[4,5],[0,5],[0,5],[-2,15],[0,10],[2,5],[5,5],[4,0],[2,0],[2,0],[5,-15],[4,-5],[2,0],[7,0],[4,10],[5,5],[0,5],[-2,5],[-3,15],[3,0],[0,5],[2,0],[2,-5],[2,0],[5,0],[6,0],[5,0],[11,5],[13,5],[11,0],[4,-15],[-8,-10],[4,-15],[-9,-10],[7,-10],[2,0],[4,-10],[5,0],[4,-25],[11,10],[18,-15],[4,5],[2,-10],[-15,-20],[7,-15],[-11,-10],[-7,-5],[-7,-11],[-4,-15],[-2,-5],[-5,0],[-4,0],[-7,-10],[-9,-5],[-11,15],[-6,-5],[-2,10],[-9,5],[-11,0],[-22,-30],[2,-20],[-2,-10],[-7,0],[-6,0],[-7,-5],[-9,-10],[-2,-10],[-9,-15],[9,-25],[9,5],[2,-15],[9,10],[2,-10],[-2,-10],[-5,5],[0,-10],[16,-5],[0,-5],[-7,-5],[-4,5],[-11,0],[-2,0],[-3,0],[-13,-10],[-11,0],[-15,-10],[-9,-10],[-5,0],[-19,20],[-11,-10],[-3,10],[0,5],[-4,15],[-9,-15],[-4,0],[-5,5],[-9,-5],[-2,-5],[-6,5],[-3,-10],[5,-21],[-7,-5],[11,-20],[5,-20],[6,-10],[0,-5],[7,-30],[0,-15],[9,0],[6,-5],[3,-10],[13,0],[11,5],[9,5],[8,5],[7,5],[4,5],[14,10],[6,-10],[5,0],[17,10],[9,-30],[-4,0],[2,-10],[-4,-5],[0,-10],[-3,0],[5,-40],[4,-15],[7,-11],[2,-10],[4,0],[25,10],[0,-5],[4,0],[2,11],[2,0],[0,5],[3,0],[2,0],[4,5],[2,0],[5,0],[2,0],[4,0],[0,5],[5,10],[0,5],[2,5],[5,5],[2,5],[2,5],[0,5],[-2,5],[-2,0],[-5,10],[-9,25],[-11,35],[2,5],[-4,20],[31,20],[11,5],[26,20],[3,6],[11,15],[2,5],[2,0],[7,5],[2,0],[4,5],[5,5],[2,0],[2,5],[2,5],[2,5],[3,10],[2,5],[0,10],[0,5],[2,5],[2,5],[0,5],[3,5],[0,5],[2,0],[0,5],[4,5],[7,5],[0,5],[0,5],[0,5],[2,5],[0,5],[2,0],[2,5],[5,5],[2,0],[0,10],[-7,15],[-2,0],[-2,0],[-4,26],[-5,0],[0,5],[7,5],[9,0],[0,5],[11,5],[4,5],[2,-10],[9,5],[4,5],[9,-20],[9,10],[7,15],[15,15],[13,0],[-2,-10],[2,0],[0,-10],[3,0],[6,-5],[13,5],[11,-20],[3,0],[2,-5],[-2,-6],[2,0],[-2,-10],[4,0],[4,-35],[3,-5],[4,15],[2,0],[9,10],[11,-5],[15,5],[23,10],[2,5],[6,-10],[7,-5],[15,0],[5,5],[2,-5],[7,0],[2,-5],[2,5],[7,5],[2,-10],[9,-15],[2,5],[2,0],[7,0],[2,0],[0,5],[2,0],[2,5],[-2,20],[-2,0],[0,5],[4,21],[-2,5],[2,0],[16,30],[2,0],[9,5],[2,-5],[15,0],[0,20],[0,10],[7,10],[4,35],[-4,0],[0,5],[-7,0],[-2,0],[-2,5],[4,15],[3,5],[2,10],[-9,10],[2,10],[-6,-5],[0,10],[-7,0],[0,10],[-4,0],[-3,6],[-2,10],[-33,5],[9,25],[-5,15],[-2,5],[-4,20],[2,15],[2,5],[-17,15],[-3,10],[11,10],[-8,20],[-11,-15],[-3,10],[-6,-10],[-5,5],[-6,-10],[-7,20],[-4,-5],[-5,0],[-6,25],[-2,0],[-9,20],[-5,0],[0,11],[-6,-6],[-3,11],[-2,10],[-4,-5],[-7,15],[-4,0],[-2,5],[2,25],[2,15],[-9,50],[0,10],[-9,10],[-2,5],[-11,15],[-9,20],[60,20],[13,6],[31,5],[48,0],[7,5],[9,10],[9,10],[15,5],[5,5],[4,-5],[13,5],[18,25],[9,-20],[22,-20],[4,5],[11,-36],[2,6],[5,-11],[-2,-5],[6,-5],[-4,-5],[6,-10],[7,15],[22,-35],[0,-20],[18,-35],[11,5],[13,-15],[13,10],[16,-5],[11,25],[6,20],[20,0],[4,-30],[20,-25],[2,5],[12,15],[4,5],[11,25],[4,5],[3,5],[2,0],[2,0],[2,0],[2,0],[0,-5],[0,-5],[0,-5],[3,-5],[6,-5],[5,-5],[2,0],[2,0],[2,0],[5,0],[2,0],[2,0],[7,10],[4,5],[2,0],[0,5],[2,0]],[[3800,6758],[-5,-5],[0,-10],[-8,-26],[4,-5],[13,5],[18,-10],[9,31],[4,-6],[5,11],[4,5],[0,5],[-11,0],[-7,10],[-2,5],[-7,0],[3,10],[-9,-5],[0,-5],[-5,-5],[-4,-10],[-2,5]],[[2779,5577],[5,-20],[11,15],[2,-5],[9,10],[4,10],[9,-5],[0,20],[0,25],[-11,10],[-5,-5],[3,-10],[-27,-20],[5,-5],[-3,-5],[-2,5],[-2,-5],[2,-15]],[[2484,5416],[9,5],[0,10],[4,5],[-4,10],[8,5]],[[2501,5451],[5,-5],[4,5],[5,-15],[13,5],[2,-5],[-20,-20],[-9,-20],[-15,5],[-2,5],[0,10]],[[2601,5522],[0,-26],[6,-20],[-2,0],[-7,0],[-2,-5],[-13,-10],[-4,-10],[-5,-5],[-2,-10],[-7,5],[-2,5],[-2,15],[2,5],[-13,25],[2,10],[2,16],[22,15],[5,0],[-2,-5],[2,-5],[6,10],[11,0],[3,-10]],[[3531,7557],[-9,5],[-13,-5],[-35,-5],[-9,10],[13,50],[0,5],[35,35],[0,10],[5,10]],[[3518,7672],[11,-5],[0,-10],[6,0],[5,-5],[24,-60],[-4,-15],[-5,-10],[-15,-15],[-9,5]],[[4150,7114],[3,10],[4,0],[2,-10],[24,-10],[31,25],[58,26],[2,5],[33,5],[15,-20],[11,-11],[25,-10],[15,26],[13,10],[13,30],[5,5],[6,10],[9,10],[-4,10],[0,5],[0,5],[-2,0],[0,5],[-3,5],[-2,0],[-2,0],[0,5],[0,5],[0,5],[-2,5],[-2,5],[-3,5],[0,10],[-4,5],[0,5],[0,5],[-2,10],[4,0],[0,10],[11,10],[33,-5],[2,0],[3,-10],[4,5],[27,5],[17,31],[7,-11],[13,-25],[0,-10],[2,-10],[0,-10],[7,-10],[4,-10],[9,-15],[4,-10],[0,-5],[0,-5],[3,-5],[0,-5],[-3,-5],[0,-10],[0,-5],[0,-10],[0,-10],[-2,-15],[0,-5],[11,0],[5,-10],[9,0],[6,-5],[2,5],[44,15],[3,-5],[26,15],[-11,20],[-2,5],[0,10],[-2,10],[6,0],[0,5],[9,0],[7,-10],[2,0],[4,0],[9,0],[2,10],[7,5],[4,5],[-2,5],[9,5],[13,10],[24,-15],[16,-40],[0,-15],[6,-20],[25,-5],[11,-15],[11,10],[4,15],[9,5],[15,0],[16,5],[13,5],[5,0],[0,5],[4,-5],[33,20],[0,-5],[7,0],[4,-5],[2,-20],[-2,-5],[-4,-5],[-7,-25],[-9,0],[-2,10],[-4,-5],[-27,-11],[0,-5],[7,0],[6,-10],[0,-5],[-4,-5],[0,-5],[13,-20],[2,0],[5,-5],[6,0],[0,-5],[5,5],[-2,-15],[2,0],[4,-15],[22,5],[18,10],[-2,5],[4,0],[20,0],[2,0],[-2,20],[-2,0],[0,30],[4,0],[2,10],[-4,26],[9,25],[22,20],[2,0],[2,5],[18,100],[11,5],[4,-5],[16,-5],[-3,20],[5,0],[-2,15],[6,5],[0,6],[9,0],[0,15],[5,5],[0,5],[17,5],[7,-20],[20,0],[4,-10],[13,5],[0,-5],[18,-11],[15,-30],[9,-5],[5,-5],[0,-5],[-3,-5],[-2,0],[-2,0],[-2,-10],[-2,0],[0,-5],[0,-5],[0,-5],[2,-10],[0,-5],[0,-10],[2,0],[0,-5],[2,-5],[0,-5],[2,-5],[5,-15],[4,0],[2,0],[5,-5],[11,-30],[9,-25],[-3,-21],[3,-25],[8,-40],[5,-10],[-5,-25],[16,-5],[0,-5],[2,-15],[2,-25],[5,-10],[0,-10],[2,-26],[4,-15],[11,-25],[3,-20],[-3,-5],[0,-25],[7,-20],[0,-5],[7,-5],[4,-15],[0,-10],[7,-10],[-3,-5],[7,-10],[15,-31],[0,-20],[7,-5],[2,-30],[29,-15],[2,-20],[13,5],[2,0],[16,0],[7,-10],[6,5],[5,-5],[8,5],[7,-5],[7,5],[8,10]],[[5413,6647],[7,-25],[2,-15],[0,-10],[2,0],[-4,-20],[-2,-5],[2,-10],[7,-10],[0,5],[2,0],[2,0],[7,5],[2,-5],[2,5],[9,0],[2,-5],[9,10],[9,10],[9,10],[8,0],[5,5],[9,-81],[8,0],[7,5],[7,5],[4,0],[2,5],[2,0],[3,6],[0,5],[31,35],[28,-61],[-2,-70]],[[5592,6441],[-33,30],[-4,10],[0,5],[-3,10],[-2,5],[-7,0],[0,5],[-15,-10],[-9,5],[0,5],[-22,5],[-2,-15],[-4,0],[-3,0],[-4,5],[-4,-5],[-5,-5],[-2,0],[-2,0],[-2,-5],[0,-5],[0,-5],[0,-5],[-5,5],[-2,-5],[-4,0],[-9,-5],[-5,-5],[-4,0],[-2,-5],[-3,0],[-2,-5],[-17,-35],[-7,-5],[-2,-10],[2,-5],[0,-10],[4,-15],[-4,-15],[-9,-15],[-22,-36],[-15,-10],[0,-15],[4,-35],[20,-5],[7,5],[59,20],[2,0],[9,-5],[13,-5],[11,-15],[-4,-5],[4,-5],[14,-10],[22,-30],[4,-10],[15,-5],[9,-20],[5,-10],[13,-15],[13,-21],[7,-20],[11,-5],[9,-25],[13,5],[15,-15],[-2,-50],[-9,-40],[-9,0],[-8,-15],[-14,0],[-26,-20],[-20,-5],[-13,5]],[[5537,5924],[2,60],[-90,40],[-5,-70],[2,-20],[-2,-5],[-26,0],[-9,5],[-24,10],[-7,0],[-24,-15],[-5,15],[5,10],[-2,75],[-33,5],[-75,-151],[-36,56],[-11,-5],[-6,-5],[-13,0],[-7,5],[-4,-5],[-3,0],[-2,0],[-2,0],[-2,0],[-2,0],[-3,-10],[-6,0],[-5,-6],[-15,0],[-9,16],[-29,0],[-11,-10],[-11,-11],[-15,-35],[-9,-5],[-13,30],[-7,-5],[-13,5],[-2,-5],[-2,-5],[-5,-10],[-2,-10],[-2,0],[-2,-5],[-3,-10],[-4,-10],[-2,0],[11,-25],[13,-15]],[[5010,5803],[0,-15],[-7,-5],[-19,0],[-31,-10],[-36,25],[-11,-15],[-11,0],[-24,-15],[-9,-10],[-6,-15],[-9,-5],[0,-5],[-11,-5],[2,-26],[31,-70],[-18,-30],[-6,0],[-25,-30],[-11,-20],[-6,-5],[-20,-41],[-7,-25],[-13,-40],[-13,-40],[-7,10],[-4,15],[6,50],[-2,0],[-15,5],[-13,15],[-5,-10],[-9,-5],[-6,-15],[0,-10],[-7,-20],[-11,-15],[-11,0],[-6,-5],[0,-25],[-7,-15],[4,-30],[5,0],[0,-20],[2,-20],[-7,-16],[0,-10],[-6,-10],[2,-10],[0,-10],[-2,-15],[-9,-10],[-5,5],[-6,-5],[2,0],[0,-5],[-2,-5],[2,-5],[0,-5],[2,-5],[-6,-15],[-14,-25],[-8,-5],[-9,-35],[13,-26],[-2,-15],[9,-20],[28,-85],[0,-25],[-6,0],[0,-5],[-14,-15],[5,-15],[-2,-15],[-16,-26]],[[6566,5537],[18,-51],[2,-20],[11,-25],[9,0],[0,-15],[9,-50],[2,-35],[0,-5],[-4,-25],[-20,-11],[-11,-10],[-9,-15],[-11,-10],[-16,-10],[-8,-5],[-9,-10],[-9,0],[-11,5],[-9,-20],[-11,-15],[-6,-20],[-9,-10],[-9,-5],[-18,-10],[-6,-5],[-7,-5],[-9,-10],[7,-10],[0,-25],[15,-21],[2,-10],[-4,-45],[-9,-20],[0,-5],[2,-10]],[[6438,4999],[-6,-20],[-11,-10],[-20,-5],[-15,-30],[-11,-10],[0,-10],[0,-10],[-18,0],[-2,10],[-11,-5],[-5,-10],[-9,-6],[-2,-10],[0,-20],[5,-20],[-3,-15],[7,-25],[0,-15],[7,-20],[-7,-10],[-11,5],[-9,-10],[-9,-10],[0,-15],[-4,-10],[-2,-10],[-2,-10],[2,-11],[-5,-10],[-6,-25],[6,-35],[-19,-15],[-9,-15],[-9,5],[-5,0],[-13,-5],[-13,-15],[-2,15],[-9,5],[-9,40],[-6,5],[0,10],[0,5],[-9,5],[-20,-20],[-20,-25],[-9,-35],[11,-40],[-2,-15],[-11,-10],[-18,-10],[-13,-26],[-6,-5],[-18,-10],[-2,-15],[-18,-20],[-13,20],[-7,5],[-4,-5],[-7,0],[-4,-5],[-5,-5],[-4,-20],[-7,-15],[-4,5],[-4,0],[-9,0],[-5,-5],[-4,-10],[0,-20],[2,-15],[-4,-10],[-2,-5],[2,-5],[2,-5],[0,-15],[0,-30],[7,-16],[4,-20],[-29,-40],[-11,0],[-13,-30],[7,-15],[-5,-15],[5,-10],[-11,-15],[-5,-15],[13,-25],[3,-26],[13,-15],[4,-5],[5,-10],[6,0],[14,-5],[4,-15],[-2,-30],[4,-20],[-4,-10],[0,-30],[6,-15],[-2,-20],[5,-11],[-7,-30],[0,-20]],[[6002,3823],[-13,-5],[-13,-5],[-9,-15],[-7,-5],[-4,-10],[-9,-15],[-13,-10],[-11,-5],[-18,-5],[-9,10],[-4,25],[2,15],[-4,0],[-5,10],[-13,10],[-7,0],[-4,0],[-9,-15],[-22,-5],[-24,-5],[-13,20],[-7,0],[-9,25],[-9,10],[-17,-15],[-16,5],[-6,-5],[-16,5],[-20,25],[-6,-10],[-11,0],[-11,-20],[-2,-15],[-9,-5],[2,-10],[-5,-10],[3,-30],[-9,-15],[-5,-15],[-4,-10],[7,-20],[-5,-20],[9,-21],[4,-40],[-19,-10],[-9,-5],[-2,-5],[-9,0],[-7,-5],[-9,5],[-8,-10],[-18,-5],[-2,-10],[-9,-10]],[[5559,3567],[-11,5],[-18,35],[-15,-15],[-29,20],[-11,20],[-6,-5],[-5,0],[-4,15],[-9,0],[-5,20],[-4,21],[-4,20],[2,25],[-5,0],[-2,5],[-2,10],[0,15],[-7,25],[-15,30],[0,20],[-4,5],[0,10],[-5,10],[9,56],[-4,10],[0,10],[13,20],[6,30],[0,10],[7,15],[0,45],[4,10],[-2,5],[-4,41],[2,5],[2,45],[2,10],[-8,20],[-18,5]],[[5495,4758],[20,15],[11,5],[9,5],[6,-5],[7,-5],[22,10],[18,15],[-7,45],[-4,10],[-5,10],[-13,15],[9,26],[0,5],[-2,20],[-23,-15],[-6,10],[-7,0],[2,5],[-4,5],[18,-5],[22,20],[2,30],[-11,25],[4,5],[7,10],[2,15],[0,30],[7,25],[6,26],[31,25],[5,10],[-3,10],[5,0],[-11,15],[-9,30],[-9,-5],[-13,5],[-15,15],[-7,0],[-2,-10],[-11,0]],[[5546,5210],[-9,30],[6,35],[-2,15],[-6,21],[2,10],[9,5],[6,10],[9,15],[-4,25],[-9,15],[2,10],[-7,10],[-11,15],[-8,-5],[-7,10],[13,25],[7,5],[29,20],[6,15],[5,31],[11,5],[8,-5],[7,5],[11,-26],[29,21],[6,10],[2,15],[27,5],[26,20],[0,10],[7,10],[2,15],[-9,20],[11,0],[16,5],[0,-5],[6,5],[-6,5],[2,20],[-2,5],[2,10],[-2,15],[0,46],[-2,15],[11,15],[6,20],[-2,15],[13,10],[14,35],[0,10],[-11,30]],[[5760,5888],[28,15],[33,-15],[13,-15],[3,-25],[-7,-35],[7,-30],[0,-86],[33,0],[11,5],[9,-15],[6,0],[13,0],[7,0],[4,0],[0,-5],[7,0],[7,-5],[4,0],[9,-5],[2,0],[4,-5],[3,0],[2,0],[2,0],[7,0],[2,0],[4,-5],[3,0],[2,0],[2,-5],[2,0],[5,5],[2,0],[6,0],[3,5],[4,0],[4,0],[5,0],[4,0],[5,0],[6,5],[7,0],[9,-20],[6,-50],[-6,-20],[2,-15],[4,-15],[11,-10],[7,-20],[4,5],[7,5],[9,0],[4,5],[5,10],[4,10],[2,10],[11,10],[0,5],[5,0],[2,5],[6,-5],[5,20],[17,0],[-2,15],[2,0],[11,-10],[42,30],[5,5],[6,-5],[0,-10],[11,-25],[20,-15],[9,5],[13,30],[16,10],[13,10],[7,-10],[13,-10],[2,-5],[13,0],[0,-15],[7,-10],[-5,-30],[5,-5],[-5,-10],[0,-15],[18,-56],[13,5],[0,5],[3,5],[2,5],[4,0],[0,5],[2,0],[0,5],[3,0],[0,-5],[2,-5],[2,-10],[0,-5],[-2,-5],[0,-5],[-2,-5],[0,-10],[0,-10],[2,-5],[0,-25],[-2,-25],[11,-30],[2,5],[2,10],[4,5],[7,5],[2,10],[2,20],[7,-5],[15,0],[5,0],[17,15],[5,15],[6,5],[9,5],[9,0],[2,10],[5,0],[4,5],[2,10],[5,0],[4,0],[5,5],[6,0],[2,10],[11,0],[5,15],[6,0],[3,6],[6,0],[5,10],[8,5],[5,10],[4,0]],[[5760,5888],[-58,-50],[-53,0],[-48,-20],[-71,40],[7,66]],[[5592,6441],[62,-50],[4,0],[2,5],[3,0],[2,5],[4,0],[2,0],[3,0],[2,0],[4,0],[2,0],[5,0],[2,0],[2,0],[5,0],[4,10],[2,0],[2,0],[3,0],[4,0],[2,0],[5,0],[2,0],[2,0],[24,0],[0,-5],[5,-30],[-7,-20],[4,-5],[7,-5],[16,5],[8,15],[7,-5],[13,10],[7,0],[2,15],[9,10],[11,0],[6,0],[11,5],[3,15],[6,0],[49,-5],[6,-5],[18,15],[0,20],[9,15],[9,20],[15,20],[2,5],[-2,15],[24,5],[3,0],[0,5],[-3,6],[0,5],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[3,0],[2,5],[-2,5],[2,0],[0,5],[2,0],[4,0],[3,0],[0,5],[0,10],[2,5],[4,5],[2,5],[-2,5],[-2,5],[4,10],[3,0],[0,5],[0,5],[-3,0],[-2,5],[-2,10],[0,5],[2,5],[2,5],[3,5],[2,5],[0,5],[4,5],[2,5],[3,0],[2,0],[2,5],[4,5],[3,0],[4,0],[2,5],[2,0],[-4,10],[0,10],[-2,10],[0,11],[-2,5],[-3,15],[-8,5]],[[6286,7049],[3,-10],[26,-35],[18,-15],[26,-5],[221,50],[11,0],[6,-5],[5,0],[4,0],[7,0],[6,0],[5,0],[6,5],[5,0],[2,0],[6,0],[3,-5],[2,0],[4,-20],[-11,-10],[-9,-66],[-15,6],[7,-61],[2,-15],[0,-10],[0,-10],[17,-5],[3,5],[4,0],[2,10],[9,0],[9,5],[11,-5],[11,-10],[7,-5],[6,-5],[-4,-5],[13,-15],[0,5],[4,-10]],[[6718,6808],[3,0],[-3,0]],[[6718,6808],[-26,-55],[-9,-21],[-26,-70],[-3,-5],[-2,-15],[-15,-15],[4,-15],[-2,0],[2,-20],[-9,-40],[5,-15],[11,-5],[4,-16],[-6,-15],[0,-10],[-5,-10],[5,-20],[-25,-20],[-8,-20],[-5,-10],[0,-15],[11,-5],[29,-15],[6,-5],[-4,-10],[-15,-10],[2,-10],[-5,-15],[-8,-6],[2,-5],[-2,-15],[-5,-10],[-2,-10],[-9,-10],[-6,-25],[-5,-30],[-2,-30],[-11,0],[-7,-10],[-2,-10],[-40,-35],[-11,5],[-4,5],[-26,-10],[-3,-11],[0,-20],[7,-25],[-20,-10],[0,-5],[-4,0],[0,-5],[2,-5],[2,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[5,-5],[15,-15],[2,-25],[0,-15],[11,-10],[5,-25],[6,-10],[3,5],[15,-20],[7,-31],[6,-10],[3,0],[4,-10],[7,5],[0,-15],[-20,-15],[31,-75],[6,10],[16,-30],[26,-15],[7,-5],[-5,-5],[-4,0],[-7,-10],[-2,-6],[-2,-35],[-5,-5],[-11,-40],[3,-15],[4,-10],[2,-10],[5,0],[6,-15],[-2,-10],[-20,-5],[-2,-5],[-11,0],[-11,-15],[-7,0],[-11,-10]],[[5010,5803],[13,10],[13,-5],[9,0],[11,20],[7,10],[9,0],[9,0],[4,-10],[22,5],[20,-15],[17,5],[25,5],[13,-10],[0,-10],[7,-25],[-9,-65],[9,-21],[-25,-30],[-15,-30],[-9,-30],[16,-10],[13,-10],[2,-5],[7,-15],[2,0],[2,0],[2,0],[5,-5],[0,-5],[6,5],[5,-5],[4,5],[13,0],[33,20],[7,-15],[0,-25],[-7,-15],[9,-5],[2,-10],[-4,-31],[-9,-20],[-2,-10],[7,-30],[-3,-35],[-11,-20],[0,-25],[-11,-15],[5,-20],[-3,-11],[11,-20],[0,-15],[3,-20],[-9,-20],[0,-30],[-7,-25],[2,-20],[7,-10],[0,-30],[9,-6],[-2,-25],[-5,-10],[-15,-10],[-9,-20],[9,-25],[11,-10],[18,-35],[8,-10],[0,-10],[5,-10],[20,-25],[11,0],[6,-10],[16,-26]],[[5376,4793],[48,30],[20,-15],[0,10],[-2,25],[-11,25],[-2,10],[-20,5],[-9,10],[-9,16],[-11,0],[-17,35],[-9,10],[9,25],[-2,20],[-9,0],[-9,5],[-7,10],[-6,0],[2,5],[0,5],[2,0],[0,10],[2,10],[2,5],[0,5],[-2,5],[0,5],[0,5],[0,5],[-4,10],[0,5],[-2,0],[-3,10],[-2,6],[0,5],[-2,0],[0,5],[2,10],[0,5],[-4,15],[0,20],[-2,5],[0,10],[0,5],[0,5],[2,5],[2,0],[0,10],[0,5],[0,10],[-2,10],[-13,5],[-7,10],[7,25],[13,5],[0,15],[0,5],[6,16],[16,-5],[4,-11],[-4,-10],[11,-20],[-16,-20],[-6,-20],[0,-25],[-2,-15],[2,-10],[13,45],[7,-15],[9,15],[8,10],[16,30],[6,-5],[9,5],[7,20],[4,-5],[5,10],[4,-15],[7,-10],[4,-40],[-2,-10],[0,-10],[2,-5],[9,-5],[13,-5],[20,15],[11,5],[13,0],[11,0],[18,5],[6,5],[14,-5]],[[7258,5517],[-8,-11],[-5,-5],[-6,-25],[-11,0],[-18,-10],[-4,-20],[-16,-35],[-11,-15],[-4,-15],[-11,-10],[-5,-20],[-9,-10],[-19,-10],[-7,-15],[-11,10],[-13,5],[-53,5],[9,-30],[-9,-6],[-5,0],[-6,-5],[-2,-5],[-16,-45],[-13,-10],[-11,-5],[-4,-10],[-9,-10],[-7,0],[-13,-15],[-7,-10],[-13,15],[-2,35],[-20,40],[0,15],[-22,5],[-24,16],[-18,0],[-2,0],[-9,-5],[-7,-16],[-8,-20],[-14,0],[-4,0],[-2,-10],[-2,-45],[4,-30],[-13,-15],[-5,-10],[-8,-30],[0,-20],[-9,-11],[-7,-15],[-4,-20],[-9,-20],[-2,-25],[-9,-10],[-16,-20],[-13,-5],[-13,0],[-33,-10],[-11,0],[-24,-5],[-18,-15],[-7,5],[-4,0],[-4,-10],[-7,-5],[-11,0],[-4,-5],[-3,-10],[-13,-5],[-13,-10],[-7,10],[-15,0],[-7,5],[0,10],[0,15],[2,5],[-2,20],[0,10],[-17,-5],[-11,10],[-5,10],[-4,0],[-13,0],[-7,5],[-27,-10]],[[6718,6808],[3,0]],[[6721,6808],[0,5],[2,0],[6,-10],[51,-86],[40,-65],[9,-20],[28,-35],[5,-5],[6,0],[33,5],[16,5],[11,5],[6,0],[14,-10],[17,10],[44,-5],[27,-15],[92,-25],[-2,-36],[0,-25],[0,-10],[0,-5],[0,-5],[0,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[-2,0],[0,-5],[0,-5],[-2,-5],[2,-10],[-2,0],[6,-30],[5,-5],[-5,-30],[7,-61],[-2,-5],[-14,-40],[-6,-30],[-16,-25],[-8,0],[-5,-15],[-18,-5],[-15,-10],[-15,-15],[-20,-25],[39,-46],[9,0],[9,-15],[9,0],[15,10],[3,-5],[11,-10],[46,45],[6,0],[7,5],[16,-15],[11,0],[4,0],[7,-15],[6,-10],[5,-10],[13,-10],[0,-10],[11,-25],[4,-10],[0,-40],[11,-35],[5,-26],[-7,0],[-4,-15],[4,-25],[-7,-25],[7,-15],[-2,-20],[0,-15],[-7,-30],[5,-15],[2,-25],[-2,-10],[-18,-6],[0,-40],[-2,-10],[6,-15],[3,-15],[17,-10],[5,-5],[6,-45],[-6,-15],[4,-10],[-7,-30]],[[5413,6647],[3,0],[2,5],[0,5],[2,15],[0,10],[-2,10],[-5,15],[0,5],[3,5],[2,10],[2,5],[0,6],[0,15],[0,5],[0,10],[0,5],[-2,10],[-2,10],[-3,15],[-2,5],[-2,5],[-2,5],[-7,0],[-4,0],[-2,5],[-3,0],[-2,15],[-2,10],[0,10],[0,15],[0,5],[2,0],[0,5],[2,10],[3,5],[2,0],[0,5],[2,0],[0,5],[2,5],[0,5],[-2,10],[-4,11],[-3,10],[0,15],[-2,5],[0,10],[-2,5],[0,5],[0,5],[2,5],[0,15],[0,5],[-2,5],[-2,5],[-2,5],[-5,5],[0,5],[0,5],[-2,5],[0,10],[0,5],[2,10],[2,10],[0,5],[3,0],[4,10],[4,5],[9,15],[2,5],[0,5],[0,11],[0,5],[3,5],[6,10],[0,10],[0,5]],[[2823,3698],[-17,-20],[-14,-11],[-4,-15],[-24,-55],[-7,-5],[-13,35],[0,10],[-20,25],[-20,-40],[-26,-30],[-27,-30],[-11,5],[-13,0],[-7,-5],[-2,-25],[-6,-10],[-3,-10],[-2,-10],[-4,-15],[-2,-26],[-7,-5],[-2,-10],[-7,-5],[-6,-5],[-3,-10],[-2,-10],[-13,-5],[-9,-10],[-9,-5],[-6,-15],[-5,-15],[-11,-10],[-4,10],[-20,-10],[-4,5],[-11,0],[-9,5],[-13,-15],[-14,15],[-11,-10],[-15,-20],[-7,-5],[-9,-20],[-15,-15],[-26,-41],[-3,-15],[-15,-25],[2,-5],[-6,-55],[-3,5],[-31,-25],[-22,-20],[-8,-5],[-11,0],[0,5],[2,5],[6,20],[9,25],[-4,20],[-18,30],[-4,0],[-2,25],[0,31],[-3,15],[5,10],[-7,10],[-2,5],[-2,5],[-2,5],[0,5],[-3,10],[0,5],[-2,0],[0,10],[2,0],[0,5],[-2,5],[0,5],[2,0],[0,5],[-2,0],[0,5],[-4,0],[-2,5],[-3,0],[-2,5],[-2,0],[-2,5],[-3,5],[-2,5],[-2,5],[-4,5],[-5,0],[-4,5],[0,5],[-5,5],[0,5],[-2,0],[-2,0],[-4,0],[-3,0],[-2,0],[-2,-5],[-4,0],[-3,0],[-2,5],[-2,0],[-4,-5],[-7,0],[-4,0],[-3,5],[-2,0],[0,5],[-4,5],[-2,0],[0,5],[-3,0],[-2,-5],[-2,5],[-2,0],[0,5],[0,5],[-2,0],[0,5],[-7,0],[-2,0],[-2,6],[-7,5],[-2,0],[-3,0],[-2,5],[-2,0],[0,5],[0,5],[-2,0],[-2,0],[-3,0],[0,-5],[-2,0],[-2,0],[-4,5],[-3,0],[-4,0],[-4,0],[0,-5],[-3,0],[0,-5],[-2,-5],[-2,-5],[-2,0],[0,-6],[-2,0],[0,-5],[-3,5],[0,6],[0,5],[3,5],[0,5],[0,5],[2,5],[0,5],[0,15],[0,5],[2,5],[-33,-35],[-2,0],[-20,-46],[-16,-15],[-6,-35],[-11,-5],[-22,5],[-7,15],[-6,0],[-11,15],[-3,10],[-6,15],[-2,15],[-5,21],[-13,0],[-13,25],[-7,25],[-9,15],[2,5],[3,5],[6,15],[2,5],[0,5],[3,5],[0,5],[0,5],[0,5],[2,5],[2,0],[2,5],[0,5],[5,10],[2,0],[2,5],[0,5],[5,0],[2,0],[-7,-20],[0,-5],[9,0],[2,0],[5,-5],[19,5],[22,15],[3,0],[2,0],[2,0],[2,0],[0,-5],[2,-5],[0,-5],[0,-5],[3,0],[2,-5],[2,0],[0,-5],[0,-5],[-2,-15],[2,0],[2,0],[2,0],[3,15],[0,5],[4,0],[0,10],[2,5],[-2,0],[2,10],[2,-5],[3,5],[2,5],[0,5],[2,5],[2,5],[5,5],[2,0],[2,5],[2,0],[0,10],[3,0],[2,0],[2,0],[2,11],[2,5],[5,10],[6,15],[3,0],[2,5],[2,5],[2,0],[2,-5],[3,0],[2,5],[0,5],[2,0],[2,5],[0,-5],[2,0],[3,5],[2,0],[2,0],[2,0],[2,0],[5,5],[-5,10],[-2,10],[2,5],[-2,5],[7,15],[-9,5],[-13,-15],[-9,0],[-4,-25],[-3,-5],[-13,25],[-11,-10],[-4,25],[-9,25],[-7,5],[2,5],[-4,5],[-15,10],[-9,10],[-5,-5],[-4,5],[0,5],[-2,0],[-2,0],[-3,0],[-2,0],[-2,-5],[-2,0],[-2,0],[-3,-10],[-2,0],[0,-5],[-2,0],[0,-5],[-2,0],[-2,0],[0,-5],[0,-5],[-3,0],[-2,-5],[-13,5],[0,5],[-7,5],[-4,-5],[-7,35],[-15,10],[0,-10],[-2,-5],[0,-5],[-3,-5],[0,-5],[3,-5],[0,-5],[-9,5],[-2,-5],[-7,0],[-2,-5],[-2,0],[0,-10],[-9,-5],[-9,5],[2,5],[0,5],[0,5],[0,5],[2,5],[3,0],[0,5],[2,5],[0,10],[0,5],[0,5],[2,10],[0,11],[0,5],[2,5],[-6,40],[8,5],[5,40],[-5,35],[3,0],[-3,15],[3,15],[-5,15],[2,15],[-2,0],[0,10],[-6,0],[-3,16],[5,35],[6,20],[3,0],[0,5],[2,5],[-11,10],[0,5],[6,0],[11,5],[9,0],[2,-5],[5,5],[2,-15],[7,5],[-3,5],[9,15],[16,40],[6,0],[5,10],[6,0],[5,5],[13,-10],[-4,-10],[13,-10],[13,-5],[7,5],[4,15],[9,-10],[4,0],[7,15],[0,10],[-9,10],[9,25],[9,16],[-9,10],[-7,5],[-4,25],[4,0],[0,10],[5,10],[4,5],[9,-15],[13,25],[5,10],[6,0],[9,20],[4,0],[7,30],[2,5],[-4,10],[13,25],[13,31],[2,0],[14,20],[8,5],[3,5],[2,-10],[7,20],[4,10],[26,40],[5,5],[0,25],[11,35],[-2,5],[-7,15],[-4,5],[-7,10],[0,6],[-2,0],[0,5],[-2,0],[-3,0],[-4,-5],[-7,-6],[-4,0],[0,-5],[-2,0],[-2,0],[-3,5],[-2,6],[-2,5],[-2,0],[-3,0],[0,-5],[-6,10],[-2,-10],[-5,10],[2,5],[-4,10],[13,25],[7,0],[0,-10],[7,-5],[19,35],[14,20],[-3,10],[-6,0],[4,10],[-2,0],[11,20],[4,15],[0,-5],[7,15],[9,5],[0,-5],[2,0],[0,-5],[2,0],[5,0],[4,10],[11,10],[0,15],[4,0],[-6,0],[0,16],[15,30],[9,20],[-9,10],[5,0],[-16,30],[2,5],[-4,15],[4,10],[7,5],[-9,10],[2,0],[5,15],[4,15],[7,10],[4,-5],[3,0],[2,-10],[2,0],[2,-5],[2,5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[16,-5],[4,15],[11,30],[0,10],[-13,11],[2,10],[-9,15],[3,5],[4,-5],[4,10],[-2,5],[5,5],[-3,0],[-4,5],[-4,10],[-3,-5],[-2,0],[-2,0],[-4,5],[2,5],[-7,10],[0,5],[2,5],[3,5],[-3,10],[7,15],[-9,15],[7,25],[4,10],[11,15],[-2,0],[7,10],[-7,16],[-7,20],[-11,20],[-4,5],[-4,10],[-9,0],[2,-10],[-11,-10],[-7,0],[-2,5],[-9,-15],[5,-15],[4,-5],[7,-15],[11,-36],[-11,-10],[-11,30],[-7,0],[-7,21],[-4,0],[-2,5],[2,0],[-2,10],[-2,5],[-3,0],[-6,20],[-9,5],[0,5],[0,5],[-2,0],[-2,5],[-3,0],[3,5],[-3,10],[-2,0],[-4,-5],[-7,15],[-9,5],[-6,0],[-5,5],[0,5],[3,5],[4,5],[2,5],[2,0],[0,5],[3,0],[0,5],[-3,0],[-2,5],[-2,0],[-2,5],[-7,10],[-2,5],[-57,101]],[[2072,5562],[72,140]],[[2144,5702],[71,-125],[9,-20],[9,-5],[6,-10],[2,5],[3,-5],[8,10],[5,-5],[13,-10],[4,-10],[-13,-21],[7,-10],[-9,-15],[4,0],[3,-5],[2,-5],[6,-15],[18,-30],[22,-35],[7,-10],[2,0],[-9,-15],[-2,0],[-11,-20],[-2,0],[-11,-15],[2,-5],[4,-5],[7,-15],[2,0],[2,0],[2,0],[3,0],[6,-6],[2,0],[3,6],[0,5],[2,0],[2,5],[0,-5],[2,5],[0,5],[3,0],[2,5],[2,-5],[2,0],[0,10],[0,5],[0,5],[13,-25],[7,10],[2,-5],[5,-5],[6,0],[5,0],[4,-10],[0,-6],[-4,-10],[0,-5],[-3,-5],[-2,-10],[0,-5],[-2,0],[22,-25],[-2,-10],[-13,-10],[2,-10],[-9,-10],[-2,-10],[6,-15],[3,5],[4,-10],[4,-5],[7,10],[7,-5],[8,25],[5,15],[2,0],[2,0],[2,5],[3,0],[2,0],[0,5],[2,0],[2,10],[0,5],[5,15],[4,5],[2,0],[3,10],[2,5],[2,0],[2,5],[5,5],[0,5],[2,5],[2,0],[4,16],[-4,10],[-4,10],[-3,-5],[-2,5],[5,5],[-3,10],[-8,-5],[0,20],[8,15],[11,5],[5,10],[-2,0],[17,20],[-2,5],[-7,-5],[-2,0],[0,10],[9,0],[9,0]],[[2501,5451],[5,20],[-7,5],[-13,25],[-53,121],[-4,10],[6,15],[0,35],[-2,15],[-9,15],[9,6],[-6,20],[4,0],[-2,10],[4,5],[-4,10],[6,5],[-2,15],[7,10],[0,5],[-2,0],[-3,5],[-2,0],[0,5],[-4,0],[-2,5],[-3,0],[-2,5],[-2,0],[-2,5],[-3,0]],[[2554,5517],[-2,-16],[-2,-10],[13,-25],[-2,-5],[2,-15],[2,-5],[7,-5],[2,10],[5,5],[4,10],[13,10],[2,5],[7,0],[2,0],[-6,20],[0,26],[-3,10],[-11,0],[-6,-10],[-2,5],[2,5],[-5,0],[-22,-15]],[[1897,4597],[-13,-25],[-4,-5],[-7,0],[-4,0],[-5,-5],[-4,5],[-9,-5],[-6,0],[-11,10],[0,5],[6,10],[0,10],[5,5],[2,10],[2,-5],[4,5],[3,-10],[13,15],[4,-10],[2,5],[3,0],[4,5],[2,0],[2,0],[5,0],[4,5],[2,5],[-4,10],[13,15],[2,15],[16,31],[2,5],[-4,0],[2,10],[18,25],[8,10],[7,10],[11,30],[-7,0],[7,20],[7,-5],[-3,-10],[7,0],[4,-10],[3,-10],[6,-10],[0,-10],[-4,-5],[2,-10],[2,0],[0,5],[2,0],[3,0],[4,5],[2,0],[7,-15],[9,-10],[11,-10],[-2,-10],[8,-11],[5,-10],[-9,-20],[-4,-10],[-23,-55],[0,-5],[3,-5],[-3,-10],[5,-5],[-7,-15],[-4,5],[-2,-5],[-7,5],[-4,0],[-11,0],[-14,10],[-17,25],[-11,10],[-7,0],[-4,0],[-25,-10]],[[1816,5200],[189,281]],[[2005,5481],[58,-110],[9,-20],[2,5],[2,-5],[2,0],[11,-20],[2,5],[5,-5],[9,10],[22,-51],[-22,-20],[-5,10],[-17,-15],[-7,5],[-13,-10],[9,-20],[17,15],[0,-5],[20,15],[7,-15],[4,0],[5,-15],[2,5],[2,-10],[4,0],[7,-20],[4,0],[3,-5],[2,-5],[-27,-30],[-17,-40],[-7,-20],[-11,-36],[4,-20],[7,-20],[2,-5],[-2,-5],[4,0],[-4,-10],[7,-15],[-14,-35],[5,-5],[9,-10],[11,20],[-3,5],[12,10],[4,-5],[2,0],[11,0],[0,-5],[2,-5],[3,0],[2,-5],[0,-5],[0,-5],[-2,-5],[-3,0],[-2,-5],[-2,-5],[0,-5],[-2,-5],[-2,0],[0,-5],[-3,0],[-4,-5],[-2,0],[0,-5],[0,-5],[-5,-10],[-2,-11],[0,-5],[-2,0],[0,-10],[-2,0],[2,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[-3,0],[0,-5],[-4,0],[-2,-5],[-2,-5],[-7,10],[4,5],[-6,5],[-2,-5],[-3,-5],[-13,0],[2,-10],[-11,-5],[-2,-10],[-13,5],[-11,-5],[-7,-10],[-2,5],[-4,0],[-9,15],[-2,-5],[-5,5],[-4,0],[-9,10],[-4,10],[4,5],[-2,10],[-9,10],[-13,-15],[-2,5],[-7,-10],[4,-5],[-4,-10],[-4,0],[-9,-10],[-7,10],[-6,-25],[-9,-5],[-13,10],[-5,-20],[-13,25],[-2,0],[-3,0],[-4,0],[-2,5],[-2,-5],[0,5],[0,5],[-9,20],[-9,10],[-15,-15],[-14,20],[-19,31],[-5,0],[-9,-21],[-2,5],[2,10],[5,11],[17,30],[-6,15],[-11,-10],[-5,10],[-22,30],[-55,90],[84,131]],[[1829,4672],[0,-5],[-2,-5],[0,-40],[-4,-10],[2,-5],[-5,-15],[-11,-10],[-2,-15],[2,-5],[-13,-25],[-20,-20],[-6,25],[2,5],[-2,10],[-16,15],[-6,20],[4,10],[2,10],[2,5],[3,0],[11,0],[2,10],[17,25],[11,35],[7,-10],[4,5],[3,5],[15,-15]],[[2819,5602],[0,-20],[-9,5],[-4,-10],[-9,-10],[-2,5],[-11,-15],[-5,20],[-2,15],[2,5],[2,-5],[3,5],[-5,5],[27,20],[-3,10],[5,5],[11,-10],[0,-25]],[[3518,7672],[-18,15],[-9,-5],[-6,15],[8,30],[-2,20],[-13,0],[-4,16],[-11,0],[-11,10],[4,25],[2,5],[-2,5],[-11,0],[-42,0],[-13,-5],[-7,-5],[-9,0],[-17,5],[-7,0],[-15,-5],[-25,5],[-8,10],[-31,35],[-9,-10],[2,10]],[[3264,7848],[5,30],[11,15],[-3,30],[0,5],[-4,10],[2,10],[-2,5],[4,6],[3,0],[2,-6],[2,-5],[7,0],[2,5],[0,6],[0,5],[2,0],[4,5],[5,-5],[4,-5],[2,-6],[5,-5],[2,5],[2,0],[2,6],[3,0],[0,5],[2,0],[4,-5],[5,-6],[2,0],[4,-5],[5,5],[4,0],[2,0],[3,-5],[0,-20],[0,-10],[0,-5],[0,-5],[0,-5],[0,-5],[2,0],[2,-5],[9,0],[2,0],[0,-10],[13,-5],[2,-5],[9,0],[13,0],[9,10],[5,5],[2,5],[4,5],[14,-5],[4,-5],[22,65],[4,16],[0,5],[-11,20],[5,5],[-7,10],[2,0],[40,10],[24,0],[25,-5],[30,10],[-2,5],[0,5],[-2,5],[-2,0],[-5,5],[-2,0],[-2,0],[-2,0],[-2,0],[-5,10],[0,5],[-2,5],[0,5],[0,5],[0,10],[0,10],[2,5],[0,5],[0,20],[0,5],[16,5],[4,-10],[0,-15],[7,0],[-5,-10],[7,-5],[6,0],[16,20],[22,-10],[13,10],[9,0],[9,0],[0,10],[-2,15],[0,10],[4,10],[-2,16],[9,25],[0,15],[6,20],[-2,25],[4,0],[5,5],[-13,20],[-9,10],[-11,5],[-14,5],[7,20],[-4,5],[0,5],[0,5],[0,10],[4,10],[0,5],[0,6],[0,5],[-2,5],[0,5],[0,5],[-2,5],[13,-5],[4,5],[7,0],[26,-25],[14,0],[13,-6],[9,11],[6,-5],[16,15],[0,5],[-9,0],[9,10],[-9,5],[-5,5],[0,5],[5,10],[2,5],[2,0],[14,-5],[15,10],[0,-10],[-2,-15],[6,-25],[5,-10],[4,0],[5,0],[6,0],[16,-11],[13,-5],[13,0],[9,-5],[11,-25],[11,-35],[-4,0],[-3,-5],[-2,0],[-6,-20],[-3,-5],[-2,0],[-2,-5],[-2,-5],[0,-10],[0,-5],[0,-5],[0,-5],[-5,-5],[-6,0],[-3,0],[-2,-5],[-2,-5],[-2,-5],[-5,-5],[-4,-10],[-2,-5],[0,-5],[-2,-15],[-3,-11],[3,-5],[-3,-10],[7,-15],[0,-10],[-2,-15],[0,-15],[-9,-45],[-4,-5],[2,-5],[-9,-5],[-2,-5],[-27,-25],[-13,-5],[-53,5],[5,-46],[2,-45],[2,-30],[-9,-5],[0,-5],[0,-5],[7,-10],[13,0],[0,-15],[2,-10],[0,-15],[2,-30],[97,20],[27,5],[62,-15],[2,-10],[11,-46],[20,-40],[17,-30],[7,-5],[26,0],[7,-5],[0,-15],[29,5],[6,-5],[0,-10],[7,5],[13,5],[-2,5],[4,25],[0,5],[0,5],[0,15],[7,30],[9,25],[9,6],[35,5],[20,10],[6,10],[7,30],[7,5],[22,20],[19,10],[9,10],[11,-5],[18,20],[6,-5],[0,20],[-4,10],[-7,0],[-4,5],[-7,20],[14,15],[6,15],[5,6],[4,-6],[2,0],[0,26],[11,5],[29,-31],[7,6],[13,-21],[24,21],[7,0],[20,15],[8,15],[-4,20],[13,10],[9,5],[2,5],[5,0],[15,0],[2,5],[-4,0],[6,10],[11,15],[-4,10],[-22,40],[4,5],[-11,51],[3,10],[4,5],[7,15],[11,10],[-3,5],[3,10],[-3,5]],[[4410,8225],[5,0],[2,5],[0,5],[2,5],[2,10],[3,0],[2,0],[4,5],[0,5],[5,5],[13,-15],[7,-30],[-5,-10],[13,-15],[3,-15],[4,-15],[0,-16],[0,-15],[4,-20],[-2,-5],[5,-20],[-3,-25],[-4,0],[0,25],[-2,0],[-44,-30],[19,-15],[5,0],[7,-10],[11,-15],[6,0],[7,0],[4,0],[0,-5],[2,-10],[7,0],[11,-5],[9,-10],[4,0],[5,-5],[2,-15],[2,-10],[2,-11],[0,-20],[0,-5],[7,-5],[4,5],[5,0],[6,-5],[0,10],[16,0],[0,-15],[6,-30],[3,-15],[0,-5],[-3,0],[0,-10],[-2,-10],[2,-5],[-2,-5],[0,-5],[-2,-10],[0,-5],[-2,-10],[0,-10],[-2,-5],[0,5],[-5,-5],[2,0],[-2,-5],[0,-5],[-2,-5],[-7,-5],[-2,0],[-4,-10],[0,-6],[-3,0],[-4,-5],[-2,-5],[-2,-5],[-5,-5],[7,-15],[-2,-20],[-18,-25],[0,-5],[7,-25],[-5,-10],[-9,-10],[-13,-10],[-6,0],[-16,-25],[-2,10],[-20,-20],[2,-15],[-26,-10],[-16,-6],[-19,-10],[0,16],[-3,20],[5,25],[-2,15],[-20,-5],[-18,5],[-26,5],[-3,5],[-4,10],[-13,15],[2,5],[-2,5],[-7,0],[0,-10],[0,-5],[-2,0],[-2,-5],[-7,-15],[-2,-5],[-4,-15],[-3,-10],[-2,-5],[0,-5],[-2,-10],[0,-10],[2,-5],[0,-5],[5,-6],[-5,0],[-2,-5],[-2,-5],[-7,-10],[-2,0],[-2,-5],[-2,0],[-3,-10],[-2,-5],[-4,-5],[-2,0],[-7,0],[-9,5],[-7,0],[-6,-5],[-7,-10],[-6,-5],[-5,-5],[-2,0],[-4,-10],[-3,-15],[-4,-10],[-4,-15],[-9,-35],[-5,-5],[-2,-5],[-4,-15],[-5,-15],[0,-21],[-2,-5],[-4,-15],[-13,-20],[-5,-10],[-11,-5],[-7,-5]],[[3826,6763],[7,-10],[11,0],[0,-5],[-4,-5],[-5,-11],[-4,6],[-9,-31],[-18,10],[-13,-5],[-4,5],[8,26],[0,10],[5,5],[2,-5],[4,10],[5,5],[0,5],[9,5],[-3,-10],[7,0],[2,-5]],[[3130,8019],[6,35],[3,35],[6,10],[0,5],[-4,5]],[[3141,8109],[4,5],[7,-5],[15,15],[16,0],[6,5],[0,10],[9,10],[15,10],[14,16],[2,5]],[[3229,8180],[7,-10],[6,0],[24,10],[5,-15],[6,-11],[11,-15],[5,-15],[4,-20],[7,-10],[0,-5],[0,-10],[-7,-15],[-2,-15],[-2,-10],[-7,-15],[-20,-10],[-24,5],[-15,-15],[-14,0],[-57,15],[-13,-5],[-9,5],[-4,0]],[[3427,8466],[2,0],[0,-20],[5,0],[2,-5],[9,-5],[29,0],[0,-10],[2,-20],[6,0],[3,-30],[-9,-36],[-9,0],[-4,-20],[8,-65],[-30,0],[-7,0],[-5,-10],[-6,0],[-7,0],[-13,5],[-11,0],[-24,-15],[-9,-5],[-11,-5],[-16,-5],[-11,-15],[-17,-5],[-18,35],[-4,25]],[[3282,8260],[11,25],[11,15],[2,10],[0,5],[-2,0],[-11,10],[-5,-5],[-4,15],[-4,5],[-3,5],[-2,-5],[-11,10],[-11,5],[-6,5],[-7,-5],[-11,-5],[2,21],[9,20],[13,40],[7,10],[15,-15],[11,-10],[9,-15],[9,-5],[4,0],[11,0],[20,-46],[11,0],[27,10],[6,11],[7,20],[6,5],[11,5],[0,20],[20,15],[-4,25],[4,5]],[[3698,8757],[-2,0],[-9,5],[-4,-5],[-4,0],[-5,-5],[-2,0],[-7,-5],[-2,0],[0,-15],[0,-5],[0,-5],[7,-10],[2,-5],[0,-5],[0,-30],[-2,-10],[-2,-15],[-7,5],[-2,-5],[-5,0],[-2,-10],[0,-5],[-9,-5],[-6,-20],[0,-5],[-5,-5],[-4,-10],[-9,-15],[-11,-21],[-2,0],[-7,0],[0,5],[-2,16],[0,20],[0,5],[-4,0],[0,10],[-5,0],[-2,10],[7,25],[-3,10],[5,10],[-16,10],[-13,0],[-11,5],[-9,0],[-22,-5],[0,5],[7,40],[4,-5],[7,30],[-18,36]],[[3524,8778],[5,0],[4,20],[-7,10],[3,10],[17,15],[3,5],[19,-5],[9,5],[13,-5],[0,30],[9,40],[22,-15],[13,-10],[-2,-20],[2,-5],[0,-10],[3,0],[9,0],[6,0],[5,0],[6,0],[2,-5],[3,0],[2,5],[2,0],[7,5],[0,5],[2,0],[4,5],[13,25],[7,10],[7,10],[6,5],[-2,10],[0,5],[9,15],[6,-5],[5,0],[2,0],[9,-5],[4,0],[9,-5],[11,-10],[18,0],[2,5],[2,10],[9,10],[4,5],[5,5],[6,0],[9,5],[2,5],[3,0],[-9,-20],[-11,0],[-2,-5],[-9,-20],[-7,-5],[-11,-20],[0,-10],[20,-10],[0,-10],[2,-15],[5,-5],[0,-15],[4,-5],[7,-5],[2,-5],[-2,-5],[-3,-5],[-2,0],[0,-5],[-2,-5],[0,-5],[-7,10],[0,15],[-4,0],[-7,-10],[0,-5],[-6,-15],[4,0],[0,-6],[-2,-5],[-9,5],[0,11],[-4,0],[-11,-5],[-2,0],[-11,-6],[-5,-5],[-2,-5],[-2,0],[-16,-10],[-9,5],[-6,0],[-5,10],[-6,5],[-5,-15]],[[3264,7848],[-9,-5],[-42,5],[-4,5],[9,20],[-5,20],[3,25],[-5,0],[-9,5],[-2,0],[-4,0],[-9,10],[-2,0],[-5,0],[-6,31],[-16,0],[-11,45],[-11,5],[-6,5]],[[3229,8180],[7,15],[-3,10],[11,15],[0,15],[5,10],[9,0],[24,15]],[[3427,8466],[-4,35],[-13,20],[-9,10],[-2,25],[4,-5],[9,-25],[4,-5],[13,15],[12,0],[4,-10],[4,5],[3,-10],[2,0],[2,5],[0,20],[7,10],[2,5],[6,26],[0,5],[0,5],[-6,15],[-9,0],[-11,15],[-7,-10],[-13,-20],[-18,-5],[-2,10],[2,10],[-6,15],[-2,10],[2,15],[13,15],[7,10],[4,0],[0,-5],[20,10],[15,25],[-2,5],[16,10],[11,5],[4,10],[4,0],[14,25],[11,5],[6,11]],[[3698,8757],[5,-5],[2,0],[2,0],[0,-5],[2,0],[3,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[5,-15],[2,-5],[2,-5],[2,-5],[0,-5],[2,0],[0,-5],[3,0],[2,-5],[2,0],[2,0],[0,-5],[3,0],[2,0],[6,0],[3,0],[2,0],[2,-5],[2,0],[0,-5],[2,-5],[0,-5],[0,-5],[3,0],[0,-5],[0,-5],[2,0],[0,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[2,0],[2,0],[5,-5],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[5,0],[2,-5],[2,0],[5,0],[2,0],[2,0],[2,0],[2,0],[5,5],[2,0],[2,0],[3,0],[2,0],[0,5],[2,0],[2,5],[5,5],[2,0],[4,0],[0,5],[2,0],[3,0],[6,10],[2,0],[3,0],[2,0]],[[3875,8647],[2,-15],[7,0],[4,0],[0,5],[0,-5],[2,0],[2,0],[0,-5],[5,5],[2,0],[0,-5],[2,-5],[2,-5],[3,0],[2,0],[2,0],[4,0],[3,-5],[2,-10],[6,-15],[7,0],[13,-10],[3,5],[6,-5],[2,0],[3,0],[0,5],[4,-5],[2,0],[5,0],[2,5],[2,-5],[4,0],[5,0],[4,-5],[2,0],[5,0],[13,-11],[2,0],[2,0],[7,-5],[2,0],[5,-5],[2,0],[2,0],[4,0],[3,0],[4,-5],[2,0],[0,-5],[0,-5],[0,-5],[-4,-5],[0,-5],[0,-5],[0,-5],[2,-5],[-2,-10],[2,-15],[2,-5],[7,-5],[-2,-5],[-2,-10],[4,0],[-7,-20],[-6,-15],[4,-5],[2,0],[11,15],[5,-5],[4,5],[-2,0],[-2,5],[0,5],[2,5],[2,0],[7,-10],[11,0],[17,40],[16,20],[4,0],[11,25],[7,5],[2,51],[0,25],[5,0],[2,10],[-5,0],[-2,10],[13,0],[14,-10],[4,5],[11,10],[11,-10],[13,-30],[0,-15],[2,-6],[0,-20],[11,0],[7,15],[7,5],[4,0],[-4,-25],[2,-25],[4,5],[14,-25],[17,-10],[5,-5],[2,-20],[6,-5],[5,-25],[11,-20],[-2,-25],[2,-5],[2,-5],[13,0],[13,-11],[11,-5],[9,5],[3,-5],[8,0],[3,-5],[19,16],[7,10],[4,-5],[3,-5],[-7,-6],[-2,-15],[2,-15],[-4,-40],[-7,-35],[20,10],[20,-25],[-3,-20]],[[3130,8019],[-29,5],[-13,0],[2,15],[-9,5],[-9,10],[-13,20],[0,5],[-6,5],[0,10],[-3,5],[-17,0],[-14,10],[0,5],[-2,5],[0,5],[2,5],[3,5],[0,5],[-3,10]],[[3019,8149],[9,5],[20,0],[11,-15],[2,-10],[5,-5],[20,-5],[28,0],[27,-10]],[[5841,9300],[0,5],[2,10],[-11,5],[-9,0],[-4,-20],[-2,0],[-2,-10],[-3,0],[-4,5],[-9,-10],[-2,0],[-2,-5],[-2,0],[-7,-10],[-2,0],[0,-5],[-2,0],[-3,0],[-2,0],[-2,0],[0,5],[-2,0],[-2,0],[-3,0],[-2,5],[-2,0],[0,5],[-4,-5],[-7,10],[-2,-5],[-5,15],[2,10],[-6,0],[-2,0],[-7,-5],[-4,0],[-7,0],[-7,-10],[-2,0],[-2,0],[0,5],[-11,-15],[-4,0],[0,-5],[-3,-5],[3,-10],[2,-10],[0,-5],[0,-5],[-2,5],[-11,5],[-3,5],[0,10],[-2,5],[-6,-10],[-7,-5],[2,-10],[2,0],[3,-5],[-3,-5],[0,-5],[3,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[-2,-5],[0,-5],[-2,-5],[-2,0],[-2,0],[-3,0],[-2,0],[-2,-6],[-7,0],[-2,0],[-2,0],[-2,0],[-3,0],[0,6],[-2,0],[-2,0],[-2,0],[0,5],[-5,0],[-2,0],[-2,0],[-4,0],[-5,0],[-6,0],[-7,0],[-7,0],[-2,-5],[-9,5],[-4,0],[2,-11],[-2,-10],[2,-5],[-4,0],[0,5],[-5,-5],[-2,10],[-4,5],[-5,-5],[-4,0],[-4,11],[2,5],[-2,5],[0,5],[-11,5],[-5,0],[-2,-5],[0,-5],[2,-5],[5,0],[2,-5],[2,-6],[-9,-10],[-7,-5],[3,-5],[2,0],[4,0],[7,-5],[-9,-5],[0,-5],[-9,5],[-6,10],[-3,10],[-2,16],[-2,15],[4,20],[3,15],[-3,5],[-4,-5],[-4,-5],[-5,-5],[-6,-5],[-7,10],[-4,0],[-5,0],[-2,0],[-9,-5],[-9,10],[-4,5],[-4,0],[-5,15],[-4,5],[-14,20],[-4,5],[-2,5],[-13,-5],[-5,0],[-4,0],[-5,0],[-4,15],[-4,15],[-5,5],[0,10],[2,10],[5,10],[6,0],[9,5],[5,5],[0,10],[6,5],[-4,10],[-2,11],[-14,30],[-6,5],[-7,0],[-2,15],[-2,0],[2,5],[2,5],[5,10],[2,0],[0,5],[2,0],[2,5],[2,5],[7,10],[0,5],[2,0],[0,5],[2,5],[3,0],[2,0],[2,-5],[11,15],[2,-5],[11,15],[5,10],[4,5],[5,5],[2,0],[9,0],[-3,5],[-2,5],[7,10],[4,5],[5,0],[8,0],[9,-5],[0,5],[-2,5],[2,5],[0,11],[5,10],[0,5],[-3,0],[-6,0],[-5,15],[-2,25],[2,10],[3,5],[2,5],[6,5],[-2,5],[2,5],[0,5],[0,5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,5],[2,0],[2,0],[3,0],[0,5],[2,0],[2,0],[2,5],[2,0],[0,5],[3,0],[0,5],[2,5],[0,5],[0,5],[2,5],[2,5],[0,5],[2,5],[3,5],[0,5],[2,0],[2,0],[0,5],[2,0],[3,5],[11,11],[2,0],[0,5],[2,0],[0,5],[2,0],[2,5],[3,5],[2,0],[4,5],[2,-5],[14,-5],[4,5],[9,10],[2,-5],[4,5],[9,0],[2,10],[14,-15],[6,-10],[2,-5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,10],[0,5],[2,0],[3,5],[2,5],[2,0],[2,0],[2,0],[3,0],[2,0],[4,0],[7,10],[11,5],[6,0],[5,10],[6,0],[9,10],[9,-5],[4,-10],[7,-10],[2,0],[0,-10],[5,0],[2,0],[7,5],[6,5],[7,5],[4,5],[-2,5],[0,10],[-4,10],[2,15],[-7,0],[-9,5],[-9,5],[-2,0],[-2,5],[0,10],[0,10],[0,20],[4,20],[5,10],[4,6],[5,-11],[4,0],[2,0],[0,-5],[5,-5],[0,-10],[0,-10],[13,0],[15,15],[5,-10],[4,-10],[5,5],[8,10],[7,5],[13,-5],[9,0],[7,-5],[4,-10],[7,-5],[0,-5],[-2,-5],[4,-5],[4,0],[-4,-20],[0,-10],[-4,-10],[-5,0],[-2,-5],[0,-5],[0,-5],[0,-5],[2,0],[0,-5],[2,-5],[3,-5],[0,-5],[2,-5],[9,-5],[-5,-25],[-4,-10],[0,-16],[13,-15],[2,-10],[5,-15],[8,-5],[3,10],[8,10],[7,10],[2,0],[2,5],[7,-5],[0,5],[7,10],[-5,11],[7,5],[9,15],[-3,5],[-2,0],[-6,0],[0,10],[2,10],[2,15],[-2,15],[-2,5],[-7,10],[2,15],[2,15],[0,10],[5,0],[0,10],[0,5],[13,10],[4,0],[3,-10],[4,-10],[0,-10],[-2,-5],[-5,-5],[7,0],[5,0],[6,-10],[5,-10],[6,-5],[2,5],[7,-10],[4,0],[3,0],[2,5],[6,0],[-2,-10],[5,-5],[0,-5],[2,-15],[-2,-5],[2,-10],[4,-10],[2,0],[5,-5],[0,-5],[-5,-5],[-6,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,-6],[0,-5],[3,-5],[0,-5],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[0,-5],[2,0],[2,-5],[2,-5],[5,-5],[4,0],[2,5],[5,0],[2,5],[0,10],[4,5],[3,-5],[11,20],[4,-5],[7,10],[4,0],[7,-5],[4,5],[5,-10],[2,5],[4,0],[-2,-5],[7,0],[4,-10],[7,-5],[-5,-10],[13,-15],[3,-5],[8,-5],[3,-5],[-3,-10],[3,-10],[-5,-10],[-11,5],[-6,-5],[-7,0],[-2,-5],[-7,5],[-4,-10],[-5,-15],[-13,-10],[2,-10],[-4,-10],[-2,-20],[-2,-5],[2,-5],[4,-5],[5,-16],[4,-15],[0,-5],[7,5],[4,-5],[4,0],[-2,-5],[11,-5],[2,0],[7,-5],[4,-5],[3,-5],[-3,-5],[-6,-20],[0,-5],[-5,-10],[3,0],[-5,-25],[-6,-30],[2,-10],[2,-10]],[[6110,9421],[-7,0],[-8,-5],[-7,-5]],[[6088,9411],[-2,5],[0,5],[0,10],[-5,0],[-8,5],[2,25],[-9,15],[0,20],[-2,10],[-2,-5],[-3,5],[3,0],[-3,10],[0,5],[-6,10],[-3,0],[-4,0],[-2,0],[-2,-5],[-16,-10],[0,-5],[0,-5],[0,-5],[-4,0],[-5,0],[-4,0],[-7,5],[-2,0],[0,5],[5,5],[-11,5],[-7,0],[-4,-10],[-3,0],[-4,0],[-4,10],[-7,0],[4,-25],[18,-15],[7,-35],[-3,-5],[-4,5],[0,-10],[-2,-5],[-2,0],[-5,-5],[-4,-5],[0,-5],[-7,0],[-15,-5],[4,0],[0,-10],[5,-5],[4,0],[0,-5],[-2,-6]],[[6434,9230],[-7,-5],[-11,10],[-4,0],[-4,-5],[-5,-5],[-6,-25],[-16,5],[-9,10],[-4,5],[11,20],[9,20],[-2,0],[-3,5],[-2,0],[-6,5],[-5,0],[-6,5],[-3,0],[-2,5],[-2,5],[0,5],[0,5],[-2,10],[-3,0],[-2,5],[-2,5],[-2,0],[-5,10],[-6,5],[-5,0],[-2,0],[-2,0],[-4,5],[-3,0],[-6,5],[-7,5],[-2,0],[-2,0],[-2,0],[-3,0],[-4,-5],[-2,0],[-2,0],[-3,0],[-4,5],[-2,0],[-2,0],[-5,0],[-6,-10],[-7,0]],[[6260,9335],[-7,15],[0,5],[5,20],[2,10],[2,11],[2,10],[5,10],[6,0],[7,0],[9,5],[-9,15],[-2,0],[-5,0],[-11,5],[3,10],[-3,15],[-2,5],[-7,5],[-2,0],[-2,5],[-2,0],[-2,0],[-7,0],[-9,0],[-6,5],[-11,0],[-7,5],[-7,0],[3,10],[2,5],[0,10],[4,5],[-4,10],[0,5],[-2,5],[0,5],[0,5],[4,-5],[7,5],[4,10],[-2,10],[11,-5],[2,5],[0,5],[2,0],[2,5],[0,5],[3,6],[2,-6],[4,11],[7,-5],[2,10],[16,-10],[0,10],[-7,30],[7,0],[0,5],[11,5],[2,5],[2,0],[2,-5],[0,-10],[2,-20],[9,-5],[-2,0],[2,-5],[-2,-5],[-7,-5],[-6,-6],[0,-10],[6,5],[7,-5],[4,0],[3,-5],[11,-25],[13,5],[2,-5],[-2,-5],[-5,-5],[-8,-10],[0,-5],[8,-5],[0,-5],[3,0],[6,5],[7,0],[2,5],[4,10],[3,-5],[2,0],[13,-5],[0,-5],[5,0],[6,-5],[0,-20],[7,-20],[9,10],[6,0],[5,-5],[6,0],[11,5],[5,0],[2,-5],[4,5],[5,-5],[-3,-5],[-4,-5],[2,-10],[7,-5],[4,-10],[-2,-15],[-7,0],[-11,0],[-4,-5],[-4,-5],[-3,5],[7,10],[2,5],[-6,15],[-3,-10],[-4,-5],[0,10],[-4,5],[-9,-10],[-7,5],[-2,-20],[4,0],[7,5],[4,-10],[-2,-20],[-6,-5],[0,-11],[-5,0],[-2,-5],[2,-10],[-2,-10],[2,0],[2,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[3,0],[4,5],[9,-10],[6,-15],[9,-20],[5,-10],[4,-35],[2,-10],[-2,-5],[0,-20],[0,-5]],[[5746,8948],[2,-5],[5,-5],[4,5],[3,0],[4,0],[9,-10],[4,5],[11,-5],[2,5],[5,10],[6,15],[5,-5],[2,5],[4,21],[7,0]],[[8072,8134],[-11,0],[-18,0],[-26,-15],[0,10],[-29,-5],[-2,-5],[-7,0],[-9,0],[-4,15],[-2,5],[0,5],[-2,0],[-3,-5],[-2,5],[-4,0],[2,-10],[-7,-5],[0,-5],[-6,-5],[0,-10],[2,-5],[2,0],[5,-10],[4,5],[9,-10],[4,5],[0,-10],[9,-5],[-4,-5],[2,-5],[-16,-10],[3,-5],[8,0],[3,0],[2,5],[2,0],[5,-5],[2,0],[4,-5],[2,0],[5,0],[-2,-25],[6,0],[2,-10],[-13,-10],[7,-5]],[[7995,7999],[0,-5],[-13,-10],[-7,-5],[4,-10],[-6,0],[-11,-10],[0,-6],[-3,0],[-2,0],[0,-5],[-2,-5],[-7,0],[-2,0],[-4,-5],[-2,-5],[-3,0],[-2,0],[-2,0]],[[7933,7933],[-2,5],[-5,5],[-2,0],[-2,5],[-2,5],[-2,11],[-3,5],[0,5],[-2,0],[-9,15],[14,10],[6,0],[5,-10],[8,0],[5,5],[6,0],[5,-5],[0,-5],[0,-5],[2,-5],[11,5],[9,5],[0,25],[-5,5],[12,10],[-16,10],[-9,-5],[-4,5],[-2,10],[-3,-5],[-2,0],[-4,0],[0,5],[-7,5],[0,15],[-4,0],[2,20],[-4,-5],[0,5],[-11,5],[-3,10],[-8,5],[-9,5],[0,-20],[-5,-10],[-4,-5],[-7,-5],[-4,0],[-9,-5],[-7,-10],[9,-30],[-4,0],[-5,-5],[11,-10],[-2,-10],[7,5],[7,0],[-16,-15],[-7,-10],[-15,0],[-11,-20],[2,-26],[-9,-5],[3,-5]],[[7832,7923],[-3,-10],[-4,-15],[-4,-10],[2,-5],[-2,-15],[-5,0],[5,-5],[-3,-20],[0,-20],[5,-5],[-13,-25],[4,-5],[-4,-20],[2,-10],[-2,0],[4,-6],[-2,-5],[0,-10],[4,-20],[2,-35]],[[7818,7682],[-15,10],[-20,5],[-18,-15],[-28,0],[-16,15],[-22,25],[-2,0],[-4,5],[-2,5],[-5,-5],[-6,5],[-5,-5],[-4,20],[-5,11],[-2,5],[-2,5],[-2,10],[-3,0],[0,5],[0,5],[0,5],[3,5],[0,5],[-20,-15],[-7,10],[-15,-5],[-13,20],[-3,0],[-2,0],[-4,5],[-2,5],[2,0],[0,5],[2,0],[-2,0],[0,5],[-2,0],[0,5],[-3,0],[-2,-5],[-2,5],[0,5],[-2,0],[-2,0],[-3,5],[-2,0],[-2,0],[-2,0],[-3,-5],[-2,-5],[-2,0],[-2,0],[-2,0],[-3,-5],[-2,0],[0,5],[0,5],[-4,5],[-5,0],[-4,0],[-2,5],[0,5],[0,5],[2,0],[0,5],[0,5],[0,5],[-2,0],[-2,0],[-3,5],[-2,0],[-2,-5],[-2,0],[0,-5],[-2,-5],[-3,0],[-4,5],[-2,0],[-2,0],[-5,0],[-2,-5],[-2,0],[-7,5],[-4,0],[-2,-5],[-3,0],[-4,0],[-9,-5],[2,-5],[5,0],[0,-5],[2,-5],[2,0],[7,-10],[0,-5],[2,0],[0,-5],[0,-10],[0,-5],[-4,-5],[0,-5],[2,0],[0,-5],[0,-5],[2,-5],[0,-5],[2,0],[2,0],[0,-5],[-2,-5],[0,-5],[2,-5],[3,0],[0,-11],[4,-5],[2,-5],[0,-5],[-2,0],[-18,-10],[-11,-5],[-15,-15],[-2,-10],[6,-25],[-6,0],[-9,-5],[-7,-10],[-4,-5],[-7,-25],[-4,-25],[-31,-20],[-9,-10],[-2,-10],[0,-10],[2,0],[7,0],[0,-6],[6,-20],[-4,-5],[2,-10],[5,-20],[-7,-15],[4,-20],[-2,0],[0,-5],[-2,-5],[-2,-10],[-2,-10],[0,-10],[0,-5],[0,-5],[2,-5],[2,-5],[2,-5],[2,0],[3,-5],[0,-5],[2,-5],[2,-5],[7,-10],[22,-66],[2,-35],[20,-70]],[[7466,7190],[-25,0],[-15,-10],[-4,0],[-11,5],[-9,20],[-11,10],[-5,10],[3,5],[2,5],[0,5],[-2,5],[-3,0],[-4,0],[-18,-15],[-11,20],[-4,-5],[-5,5],[0,5],[-2,5],[-6,15],[-3,-5],[-8,0],[-7,0],[-2,5],[11,5],[-9,5],[-4,10],[-7,-5],[-9,0],[-6,-10],[-3,-10],[-15,-10],[0,5],[-2,5],[-3,0],[-8,5],[-3,0],[-2,0],[-2,0],[-7,-5],[-6,0],[-9,0],[-4,5],[-5,0],[-2,0],[-2,5],[-5,0],[-2,0],[-2,5],[-9,5],[-6,5],[-3,5],[-4,0],[-2,0],[0,5],[-2,0],[-3,5],[-2,5],[-6,5],[-5,5],[-2,0],[-2,5],[4,15],[20,21],[11,30],[0,10],[7,5],[-3,0],[-2,5],[-2,5],[0,5],[-2,5],[-2,5],[-3,5],[-4,5],[0,5],[-2,5],[4,30],[-9,25],[3,10],[-5,15],[0,10],[-6,6],[2,5],[2,5],[4,0],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[5,0],[6,5],[3,0],[2,5],[4,5],[2,0],[3,0],[4,5],[2,5],[0,5],[-17,50],[-7,5],[-7,-5],[-4,0],[-4,0],[-3,-5],[-2,0],[-2,0],[-2,0],[-5,-5],[-6,-5],[0,15],[-16,30],[18,40],[-5,10],[-2,-10],[-6,-5],[-11,-10],[-3,30],[-6,16],[15,-6],[20,6],[2,5],[9,10],[0,15],[9,10],[4,15],[5,0],[0,5],[0,5],[-2,0],[-3,5],[3,5],[2,5],[0,5],[0,5],[-2,0],[-3,10],[0,5],[0,5],[0,5],[3,0],[0,5],[4,5],[0,5],[2,-5],[2,0],[7,0],[2,0],[2,0],[3,0],[2,0],[0,5],[2,0],[0,10],[2,0],[0,5],[-2,5],[0,5],[0,5],[0,5],[0,5],[-4,5],[2,0],[2,5],[2,0],[0,-10],[2,0],[0,5],[3,0],[2,-5],[2,0],[2,0],[5,10],[4,0],[2,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,5],[5,5],[2,0],[4,0],[3,0],[2,0],[2,-5],[0,-5],[2,0],[16,10],[6,-10],[5,0],[4,10],[16,-5],[0,-10],[8,5],[25,-10],[2,-5],[6,0],[14,-5],[9,5],[13,5],[13,5],[7,5],[4,10],[2,-5],[0,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[0,-5],[2,0],[5,5],[4,0],[4,0],[12,5],[6,6],[5,0],[4,10],[2,-5],[2,-5],[5,0],[6,10],[3,5],[4,0],[2,5],[2,0],[3,5],[6,0],[2,5],[5,-5],[2,0],[2,5],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,5],[2,-5],[4,0],[5,-5],[2,0],[2,-5],[0,-5],[0,-5],[2,0],[0,-6],[5,0],[4,0],[3,0],[2,0],[2,0],[9,0],[15,11],[9,10],[7,0],[22,10],[8,15],[-4,0],[2,15],[5,-10],[4,15],[-7,20],[7,5],[4,10],[0,25],[-6,20],[2,0],[2,10],[2,5],[0,5],[3,5],[4,0],[0,-5],[5,0],[0,-5],[2,0],[4,5],[2,0],[3,0],[2,0],[2,-5],[4,-5],[3,-5],[4,0],[2,5],[-2,0],[2,5],[2,0],[7,5],[4,0],[5,0],[4,5],[2,5],[5,5],[2,5],[2,0],[5,5],[2,0],[9,0],[6,5],[2,-5],[3,0],[2,0],[4,5],[2,0],[5,5],[13,5],[0,6],[13,5],[9,10],[11,10],[2,5],[7,5],[4,0],[3,0],[2,0],[4,5],[2,5],[3,0],[4,0],[2,0],[0,-5],[5,0],[2,5],[0,5],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[-9,15],[-2,15],[0,10],[4,5],[5,10],[7,15],[22,5],[2,-10],[6,0],[0,-10],[-2,-5],[0,-5],[9,5],[7,5],[0,-5],[11,5],[8,-5],[0,-5],[11,0],[11,0],[12,0],[15,-5],[11,-15],[0,-5],[15,5],[3,-15],[15,-15],[11,-5],[4,-10],[22,-10],[3,-5],[17,-15],[3,-11],[-3,-10],[-8,-5],[-18,-10]],[[7818,7682],[0,-15],[0,-35],[-2,-35],[-4,-5],[2,0],[0,-5],[-2,-5],[-5,-41],[-11,-30],[7,-35],[-9,-10],[-6,-10],[2,-15],[-5,-20],[-2,-20],[2,-15],[-6,-20],[-9,-10],[-5,-11],[-6,-15],[-2,-10],[-5,-10],[-13,-20],[-4,-10],[-9,-15],[-7,-5],[-13,-15],[-13,-20],[-13,-15],[-5,-10],[-11,-5],[-15,-15],[-3,0],[-13,5],[-9,-10],[-28,-41],[-11,-5],[-11,0],[-22,-15],[-27,31],[-13,20],[-31,5],[-13,15],[-2,5]],[[7933,7933],[-4,-10],[0,-5],[-11,-5],[-7,10],[-4,0],[4,15],[-4,5],[0,5],[-20,-5],[-9,-5],[-22,-10],[-24,-5]],[[8072,8134],[-11,-15],[-9,0],[-4,-10],[-16,-15],[-26,-20],[2,-5],[2,-5],[-2,-10],[11,-5],[0,-5],[7,-5],[-3,-5],[9,0],[5,-5],[6,-10],[-11,-5],[-9,-10],[-13,5],[-15,-10]],[[6586,7828],[5,10],[8,10],[5,5],[2,0],[2,0],[2,5],[5,20],[9,-5],[6,5],[2,-5],[7,30],[9,0],[-2,10],[4,10],[0,10],[2,10],[2,0],[0,5],[-2,5],[2,6],[-4,10],[-2,0],[2,10],[2,0],[7,25],[11,5],[2,-5],[13,0],[5,15],[0,20],[2,10],[0,15],[-4,10],[2,5],[-2,15],[-5,5],[5,0],[8,0],[9,10],[0,10],[2,5],[9,-5],[16,5],[4,-10],[4,10],[11,10],[3,15],[4,10],[13,-25],[7,5],[7,10],[6,-10],[-6,-15],[8,10],[3,5],[-3,0],[-2,5],[0,5],[2,0],[0,5],[11,-5],[5,10],[0,-5],[2,5],[-2,6],[4,0],[0,5],[13,-5],[-2,5],[7,-5],[9,0],[-5,15],[5,0],[4,-5],[4,5],[-17,15],[-2,0],[0,5],[-5,5],[-6,5],[0,5],[-11,5],[-3,0],[-8,5],[-7,5],[-2,-5],[-11,10],[-7,5],[-2,10],[7,5],[2,5],[-2,15],[-3,5],[5,5],[-11,10],[-11,5],[-9,5],[-11,5],[-5,5],[7,10],[-7,5],[0,20],[-4,-5],[-2,10],[-5,0],[5,5],[2,5],[0,11],[2,-5],[7,5],[0,10],[-2,5],[4,5],[11,5],[7,-10],[13,10],[4,-5],[7,10],[9,5],[2,-5],[11,20],[-2,5],[4,0],[2,0],[0,-5],[11,-15],[5,0],[0,-10],[9,0],[4,-15],[9,10],[-2,5],[8,15],[5,-10],[4,0],[9,10],[7,0],[2,-5],[4,5],[7,10],[4,0],[7,-15],[-2,-5],[2,-5],[-2,-5],[4,-5],[9,-31],[18,11],[2,10],[2,-5],[9,-5],[20,0],[-3,-6],[5,0],[4,-15],[5,0],[9,0],[6,5],[-2,16],[4,0],[7,0],[18,10],[11,-10],[11,15],[13,0],[2,0],[4,5],[7,10],[9,35],[-5,15],[12,20],[2,0],[0,-10],[2,-5],[2,15],[7,-5],[-2,-5],[-5,-20],[9,-10],[2,-5],[2,0],[5,0],[4,5],[-2,5],[7,0],[4,-30],[13,10],[9,-10],[0,-10],[9,5],[4,-5],[25,0],[-7,-10],[2,-21],[-2,0],[7,-5],[-3,-10],[9,-5],[5,15],[6,11],[5,-6],[11,6],[6,-6],[2,6],[9,-6],[-2,-10],[11,0],[4,0],[5,-5],[9,0],[4,-20],[11,-5],[0,5],[13,-5],[11,0],[9,10],[11,5],[13,5],[3,10],[4,10],[4,0],[9,-5],[2,-10],[3,0],[0,-5],[17,0],[5,-10],[0,5],[9,5],[2,0],[2,5],[2,5],[2,0],[3,5],[0,5],[2,6],[13,10],[9,25],[4,0],[-2,5],[0,5],[-2,5],[0,5],[2,5],[0,5],[-2,5],[-2,5],[0,5],[-3,0],[-2,5],[-2,0],[-2,0],[0,-5],[-5,-5],[-2,-5],[-2,0],[-2,0],[-2,0],[0,5],[2,10],[-2,5],[-3,0],[5,20],[11,5],[2,-5],[4,15],[0,5],[-13,0],[-17,30],[-3,-10],[3,0],[0,-10],[-9,0],[-3,-15],[-6,5],[-7,-10],[0,-5],[-13,5],[0,-5],[-4,-5],[-3,0],[-2,0],[-2,0],[-11,10],[-9,0],[-6,20],[2,0],[4,0],[7,5],[6,-5],[0,-10],[5,0],[0,20],[6,0],[5,20],[-7,15],[2,0],[3,0],[2,0],[2,0],[4,5],[11,5],[3,0],[2,0],[2,6],[11,0],[5,10],[8,0],[11,-21],[3,0],[2,5],[0,11],[-5,15],[5,5],[6,0],[-4,5],[4,5],[5,0],[9,0],[2,-10],[11,-5],[2,10],[15,-5],[3,0],[4,15],[0,-25],[-4,-15],[4,0],[7,-21],[2,0],[2,0],[2,0],[3,0],[2,0],[4,0],[2,0],[3,0],[2,0],[4,0],[2,0],[0,-20],[-2,0],[-2,0],[-2,-5],[-2,0],[-3,0],[-2,-5],[-2,0],[-2,0],[-5,-10],[5,-5],[-11,-20],[-9,0],[-2,0],[-3,-20],[0,-10],[3,0],[2,10],[4,5],[11,-10],[14,-5],[8,-5],[0,10],[5,10],[13,-10],[9,-10],[2,5],[9,0],[2,-5],[0,-20],[-2,-10],[-9,0],[-2,-5],[-2,-5],[13,-10],[-5,-5],[-2,0],[-2,-10],[-4,-10],[13,5],[6,5],[7,0],[4,-5],[3,-5],[6,-16],[2,0],[5,0],[2,-5],[4,-10],[0,-15],[14,-5],[2,10],[2,5],[5,10],[2,10],[-5,5],[5,11],[-2,5],[6,5],[0,10],[5,10],[0,15],[8,0],[7,5],[0,10],[7,5],[11,-5],[2,5],[2,5],[4,15],[9,5],[2,5],[3,5],[2,5],[2,0],[2,0],[5,5],[147,201]],[[7818,8687],[27,-50],[37,-5],[42,5],[24,-161],[0,-5],[-2,-20],[0,-5],[5,-15],[2,-5],[4,-15],[11,-15],[11,-15],[7,-5],[2,-5],[16,-41],[6,-20],[0,-5],[2,-5],[5,-20],[2,-5],[2,-5],[0,-5],[7,0],[4,-5],[5,0],[2,0],[0,5],[4,0],[0,10],[2,5],[3,10],[0,10],[4,0],[2,0],[2,-5],[5,-10],[2,0],[4,-25],[3,-5],[4,-5],[2,-5],[5,-5],[6,-5],[9,0],[13,0],[9,-5],[11,0],[13,-5],[9,-5],[2,0],[3,-5],[2,0],[2,-5],[2,-5],[0,-5],[0,-5],[-4,-10],[-13,-20],[-11,-21],[-3,-5],[0,-5],[-2,-5],[0,-5],[2,-10],[0,-5],[3,-5],[6,-30],[2,-15],[0,-5],[0,-25],[3,-35],[0,-5],[0,-15],[6,-5],[5,-10],[2,-6],[0,-5],[2,0],[0,-5],[7,-10],[13,-10],[4,-5],[3,0],[4,-5],[4,-10],[0,-10],[0,-20],[0,-10],[-2,-10],[-6,-15],[-7,-15],[-9,-15],[-2,-5],[-9,-10],[-15,-5],[-3,0],[-6,0],[-7,0],[-2,0],[-4,0],[-16,-5],[-9,-5],[-4,0],[-2,0],[-2,-5],[-5,5],[-11,-15],[-13,-31],[-16,-25],[-8,-15],[-5,-15],[-2,-5],[-4,-25],[-3,-10],[-2,-20],[-6,-35],[-5,-25],[-4,-16],[0,-5],[-5,-15],[-6,-15],[-9,-10],[0,-5],[-18,-20],[-9,-5],[-2,-5],[-17,-25],[-3,0],[-2,-5],[-2,-5],[0,-5],[-2,-5],[0,-5],[-2,-20],[-3,-5],[-4,-25],[-2,-5],[-2,-5],[-3,-6],[-8,-10],[-9,-10],[-11,-10],[-7,-10],[-2,-5],[0,-10],[0,-25],[-2,-5],[-3,-15],[-17,-80],[-2,-10],[-20,-51],[-13,-35],[-3,-10],[-4,-15],[-2,-20],[0,-15],[-2,-10],[-7,-20],[-13,-46],[-2,-10],[-3,-30],[-4,-30],[0,-15],[0,-15],[9,-60],[4,-20],[7,-26],[9,-25],[11,-25],[6,-15],[5,-20],[8,-40],[5,-50],[4,-36],[7,-60],[0,-15],[-2,-15],[-7,-45],[-4,-5],[-5,-10],[-22,-25],[-24,-36],[-24,-20],[-11,-15],[-5,-10],[-2,-5],[0,-10],[9,-45]],[[7759,6200],[4,-15],[9,-25],[7,-20],[4,-10],[11,-21],[33,-80],[2,-5],[5,-30],[2,-5],[2,-10],[2,-5],[5,-10],[2,-5],[2,-10],[2,-5],[3,-5],[11,-20],[2,-6],[4,-10],[42,-80],[-11,-15],[-13,5],[-20,-10],[-4,0],[-9,-10],[-7,-15],[5,-15],[-3,-5],[0,-40],[-28,-11],[-5,-25],[-6,5],[-5,-25],[-4,-15],[0,-10],[-7,-5],[3,-5],[-16,-10],[-2,-30],[-13,-20],[-5,-25],[2,-25],[20,-21],[-13,-20],[-15,-10],[-9,-25],[-9,-5],[2,-15],[5,-30],[-7,-25],[-24,0],[-5,0],[0,-10],[5,-15],[-5,-20],[-2,-10],[-9,-11],[-17,31],[-7,5],[-11,25],[-11,5],[-7,10],[-8,5],[-5,0],[-2,5],[-4,0],[-11,10],[-9,0],[-7,0],[-9,0],[-2,5],[-2,0],[-4,0],[-9,10],[-11,10],[-11,5],[-31,0],[-16,-5],[-30,15],[-9,-10],[-9,20],[-20,0],[-18,-5],[-8,0],[-11,20],[-7,5],[-13,0],[-7,-5],[-18,10],[-4,0],[-11,-10],[-13,10],[-11,0],[-18,-15],[-24,20],[-5,25],[-11,16]],[[7699,8456],[-2,-15],[5,-5],[-5,-15],[5,-5],[0,-5],[8,0],[-2,-10],[7,0],[9,-5],[13,-5],[-5,-20],[0,5],[7,5],[4,5],[9,5],[2,5],[3,0],[2,0],[0,5],[-2,5],[-5,5],[-4,5],[-2,5],[-3,5],[-2,5],[-4,0],[-5,5],[-13,5],[-9,5],[-2,0],[-6,10],[-3,0]],[[7499,8491],[-7,5],[-2,5],[-2,5],[2,5],[7,0],[4,-5],[-2,-15]],[[7060,1768],[-13,0],[-31,45],[-7,5],[-8,21],[-3,20],[-26,60],[-18,25],[-48,35],[-2,5],[-9,40],[0,21],[-7,30],[-2,10],[-9,0],[-4,-5],[-7,20],[11,10],[5,110],[-14,41],[-17,25],[-3,15],[-11,30],[-8,50],[2,15],[11,10],[9,30],[8,21],[5,5],[4,5],[7,30],[-7,20],[-13,25],[-4,15],[4,10],[9,15],[-9,20],[9,25],[-2,15],[4,0],[24,21],[14,10],[2,15],[9,25],[2,30],[-2,20],[0,15],[4,10],[-4,20],[-5,35],[-9,26],[9,35],[11,20],[-9,15],[-4,20],[26,20],[-2,35],[-26,71],[-2,25],[2,0],[0,10],[-5,25],[9,20],[2,15],[3,20],[4,25],[-2,15],[-20,41],[0,20],[-13,15],[-11,10],[-29,-20],[-15,5],[-7,10],[-13,10],[6,15],[-4,15],[-2,5],[-11,10],[-2,10],[2,10],[-16,40],[-11,10],[-9,20],[-4,26],[2,30],[-4,25],[-2,20],[-7,5],[0,15],[11,10],[2,20],[-4,10],[-5,40],[14,36],[-5,15],[9,20],[0,20],[7,25],[6,15],[5,5],[0,15],[4,20],[16,5],[-5,10],[5,10],[-3,10],[-13,16],[-6,10],[0,30],[-14,-5],[-6,10],[-9,10],[-11,0],[-11,25],[-11,15],[-22,5],[-27,-15],[-24,-30],[-15,5],[-9,-5],[-5,40],[7,35],[-13,60],[-11,11],[-2,-11],[0,-30],[-20,-25],[-2,0],[-18,10],[-13,0],[-5,10],[-4,0],[-9,-15],[-15,-5],[-5,-10],[-6,-5],[-5,-20],[5,-30],[22,-45],[-5,-5],[2,-20],[-17,-26],[-11,-10],[-20,-15],[-13,-15],[-22,-10],[-5,-10],[-28,-10],[-9,-10],[-11,-5],[-24,-35],[-25,5],[-4,20],[0,15],[-64,-40],[-35,25],[-51,30],[-7,-5],[-8,5],[-9,10],[-11,-15],[-16,-5],[-24,25],[-7,-10],[-6,-10],[-7,0],[-2,-10],[-29,15],[-2,15],[-2,10],[-5,0],[-6,10],[-11,-5],[-16,0],[-11,-5],[-4,0]],[[7759,6200],[0,15],[13,5],[0,-15],[4,-15],[5,0],[2,10],[11,25],[7,-5],[6,-5],[3,0],[2,15],[9,-5],[17,0],[5,5],[6,15],[31,10],[20,10],[9,-5],[4,-10],[7,-5],[6,-10],[3,-10],[2,-30],[6,-10],[7,0],[11,10],[9,10],[9,0],[11,5],[6,-5],[16,10],[9,10],[4,0],[4,10],[5,0],[4,0],[7,15],[9,-5],[4,-5],[18,-30],[13,-5],[4,-5],[3,0],[0,-5],[2,0],[9,0],[13,5],[4,5],[5,5],[2,5],[4,20],[2,5],[3,0],[15,-5],[9,0],[2,-5],[2,0],[7,5],[4,5],[2,0],[12,-5],[4,0],[2,5],[7,5],[4,5],[2,0],[7,0],[0,-5],[0,-5],[0,-5],[13,-15],[0,-5],[2,0],[5,0],[4,-5],[2,-5],[9,-5],[5,0],[4,0],[4,5],[9,5],[0,-5],[2,-5],[-6,-10],[2,-10],[13,-10],[9,-5],[5,-5],[13,0],[2,0],[26,-10],[7,0],[0,5],[0,-5],[2,-5],[7,0],[0,-10],[4,-5],[7,-5],[4,0],[13,5],[9,0],[3,0],[13,5],[11,0],[13,0],[7,-5],[4,0],[0,-5],[4,-6],[3,0],[4,-5],[0,-5],[4,-10],[3,0],[4,-5],[4,-5],[11,-5],[9,-15],[0,-5],[3,0],[11,-15],[11,0],[15,-10],[2,-5],[13,-20],[5,0],[6,-10],[7,0],[2,5],[0,5],[2,0],[5,0],[6,5],[14,0],[4,5],[5,5],[2,5],[2,10],[2,10],[2,0],[3,0],[4,-5],[2,0],[9,0],[18,-5],[2,0],[2,0],[4,-15],[3,0],[-3,-5],[-6,-5],[-2,-5],[-3,-5],[-8,-5],[-3,0],[3,-5],[2,-10],[2,-10],[0,-10],[4,0],[14,-10],[2,-5],[15,-10],[0,-5],[0,-20],[0,-6],[2,-5],[3,-10],[0,-5],[2,-5],[-2,-10],[-7,-5],[-7,-10],[-4,-10],[4,-10],[-4,-5],[-9,-20],[-6,-10],[-3,-10],[3,-5],[0,-5],[0,-10],[-9,-15],[-2,-10],[13,-25],[4,-5],[-2,-21],[-2,-5],[-5,-10],[3,-10],[2,-35],[9,-5],[-5,-10],[-2,0],[0,-5],[-4,-10],[2,0],[6,0],[11,-10],[22,-5],[7,-10],[5,-10],[0,-5],[2,0],[2,0],[2,-5],[2,0],[9,0],[2,0],[7,0],[7,-5],[0,-5],[2,-10],[2,0],[15,-20],[29,-21],[7,0],[15,-5],[5,11],[4,0],[4,0],[14,5],[6,-11],[2,-10],[9,5],[11,5],[2,11],[9,-5],[5,0],[4,-21],[0,-25],[7,0],[6,0],[7,-15],[15,-5],[7,-5],[4,-5],[9,-5],[9,10],[11,0],[7,5],[0,-5],[2,-5],[4,-10],[2,-5],[5,0],[2,-5],[4,-5],[11,-35],[7,-5],[7,0],[4,-10],[2,-5],[5,-15],[4,-5],[5,0],[6,-10],[7,-10],[-5,-21],[-2,-5],[2,-5],[3,-30],[8,-10],[5,0],[0,-5],[4,0],[31,5],[22,-10],[7,5],[13,-10],[-2,-5],[0,-10],[0,-10],[0,-5],[0,-5],[13,-15],[9,-20],[6,-20],[14,5],[15,15],[2,5],[2,5],[5,5],[6,5],[12,-10],[11,0],[13,5],[2,5],[2,0],[5,15],[4,-5],[11,0],[4,0],[5,-10],[2,-5],[11,15],[13,0],[2,0],[7,15],[2,0],[5,0],[4,0],[7,10],[4,5],[2,10],[16,15],[9,20],[11,5],[11,-10],[33,10],[9,-5],[22,0],[-5,15],[2,15],[-2,21],[2,0],[0,5],[5,15],[0,25],[-2,5],[-5,10],[-2,5],[-7,5],[0,15],[-2,5],[0,15],[7,5],[2,5],[7,15],[6,55],[2,11],[0,5],[3,0],[4,10],[2,10],[0,10],[0,25],[0,5],[0,20],[38,-10],[8,0],[3,0],[9,-5],[24,-15],[26,-15],[7,-5],[2,0],[7,-10],[6,25],[5,0],[2,0],[13,5],[16,0],[2,20],[0,5],[-2,5],[-11,15],[-3,5],[-4,10],[-5,10],[0,10],[3,10],[2,15],[0,5],[0,5],[2,5],[2,0],[7,5],[7,5],[15,0],[9,10],[4,21],[0,25],[0,5],[2,5],[3,10],[4,10],[4,20],[11,25],[0,5],[0,15],[9,5],[7,30],[0,5],[4,5],[14,5],[11,0],[24,-5],[22,36],[2,5],[4,5],[5,5],[2,0],[4,0],[5,-5],[17,-15],[3,-11],[0,-10],[2,-5],[2,-10],[7,-10],[4,0],[2,-5],[5,-15],[2,-5],[7,-10],[6,0],[5,-5],[4,-5],[9,-10],[0,-5],[4,-5],[2,-5],[-2,-15],[0,-5],[0,-5],[-4,-10],[-2,-10],[0,-5],[-3,-10],[0,-5],[0,-5],[0,-5],[3,0],[4,-10],[2,0],[2,-5],[3,0],[2,0],[6,0],[3,-6],[2,0],[4,0],[2,0],[5,-5],[4,-5],[5,0],[4,0],[7,-5],[2,0],[7,0],[6,0],[2,-5],[3,-5],[2,0],[6,-5],[7,-5],[4,-5],[3,0],[4,-5],[2,-5],[2,-5],[3,-10],[11,-10],[2,-5],[4,0],[7,0],[9,-5],[-3,-10],[-2,0],[0,-5],[5,-5],[-5,-10],[0,-10],[2,-5],[3,-10],[0,-5],[0,-5],[0,-5],[-3,-10],[0,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[0,-5],[0,-11],[-2,0],[-2,-10],[-2,0],[-3,0],[-2,-5],[-2,0],[-2,-5],[0,-5],[0,-5],[-2,-15],[0,-5],[0,-5],[-3,-5],[-2,-5],[0,-5],[0,-5],[0,-5],[0,-10],[0,-10],[-2,0],[0,-5],[-4,-10],[-3,-5],[-2,-5],[-2,-5],[-4,-5],[-5,-10],[-2,-5],[7,-10],[4,-10],[-2,-15],[4,-15],[0,-6],[0,-15],[-2,-15],[0,-5],[-2,-5],[-2,-15],[0,-5],[0,-5],[4,-25],[4,-30],[-6,-5],[-11,-35],[4,-10],[0,-15],[-6,-10],[-7,5],[-2,-16],[-5,-10],[7,-25],[-9,-15],[0,-20],[5,-5],[-7,-25],[-11,-40],[-4,-5],[0,-10],[-20,-15],[-9,-5],[-11,0],[-2,-10],[-5,-5],[2,-5],[-4,-21],[-7,0],[0,-5],[14,-10],[2,-10],[9,-10],[0,-10],[2,-5],[9,-20],[6,-15],[0,-25],[5,-25],[-3,-40],[-2,-11],[-15,6],[-29,-41],[-24,-20],[0,-10],[-24,-25],[6,-15],[11,-10],[5,-25],[9,-15],[8,-10],[-2,-20],[-2,-15],[-2,-16],[-16,-15],[-11,0],[-22,-80],[-11,-10],[-9,-5],[-4,-5],[2,-5],[5,-15],[8,-25],[5,-25],[-2,-21],[6,-35],[-4,-10],[2,-20],[4,0],[5,-10],[0,-20],[9,-15],[4,-25],[-4,-10],[4,-10],[16,-10],[24,15],[50,5],[7,10],[35,-40],[3,0],[46,-81],[11,-10],[7,0],[-3,-20],[-13,-30],[4,-35],[-6,-30],[2,-10],[7,-6],[-11,-40],[4,-20],[-9,-10],[-9,-20],[0,-15],[-4,-5],[-2,-20],[9,-30],[-16,-46],[0,-10],[2,-10],[-13,-10],[-15,-5],[0,-20],[-7,-10],[-9,-20],[-33,30],[-6,20],[-25,30],[-11,21],[-8,0],[-31,-31],[-7,-5],[-9,5],[-11,10],[-11,16],[-9,0],[-8,10],[-5,5],[-6,5],[-16,10],[-24,0],[-2,-15],[-3,-21],[-17,-25],[-9,-5],[-18,30],[-11,16],[-13,-21],[-6,0],[-11,-5],[-7,10],[-16,0],[-11,6],[-4,10],[2,15],[2,15],[-6,15],[-7,20],[-6,25],[-22,15],[-9,5],[-7,20],[-13,-5],[-22,-30],[-18,20],[-4,15],[-7,55],[0,11],[2,10],[7,20],[7,20],[8,10],[9,25],[7,10],[-5,10],[-26,50],[-11,25],[-2,26],[2,15],[-2,5],[-5,-5],[-4,-5],[0,-5],[-7,0],[-6,-5],[-5,-11],[-4,0],[-4,-5],[-3,-5],[-2,-5],[0,-5],[-4,-5],[0,-10],[0,-5],[-5,-15],[-4,-10],[-20,20],[-29,10],[-2,5],[0,5],[2,5],[-22,-10],[-42,-40],[-8,0],[-5,0],[-13,-5],[-18,-20],[-15,0],[-2,-15],[-5,0],[-13,-15],[-33,10],[-13,20],[-11,0],[-7,-30],[0,-10],[5,-10],[-7,-15],[-2,-20],[9,-26],[4,-15],[-11,-25],[-4,-20],[-38,-10],[2,-20],[11,-20],[-6,-20],[-9,-10],[-13,-10],[-5,-20],[-4,-25],[-9,-6],[-4,-15],[-33,-10],[-5,-20],[0,-5],[5,-15],[15,-20],[-7,-15],[7,-30],[-7,-50],[-8,-10],[-11,-5],[4,-31],[11,-20],[-7,-20],[-2,-10],[0,-20],[7,-10],[-11,-30],[0,-20],[4,-5],[13,-25],[3,-31],[4,-5],[-4,-25],[-11,-15],[0,-5],[-7,-5],[-4,-15],[0,-15],[-7,-10],[7,-20],[19,-10],[3,-5],[8,5],[5,-15],[0,-30],[4,-20],[9,-11],[15,11],[7,5],[7,-5],[6,-16],[-2,-10],[5,-10],[24,10],[11,-10],[9,0],[4,20],[7,0],[6,16],[18,-11],[4,16],[18,10],[4,5],[5,-5],[4,-10],[22,-5],[0,-6],[9,-20],[2,-35],[0,-10],[5,-5],[11,10],[4,5],[7,0],[15,-45],[-9,-10],[-2,-10],[4,-60],[-4,-20],[-13,-11],[-16,5],[-4,0],[-9,0],[-17,-20],[-16,-20],[0,-15],[-4,-25],[6,-30],[3,-15],[-14,-5],[-11,-15],[-11,-20],[-11,0],[0,-5],[0,-36],[-6,-15],[-3,-25],[0,-20],[18,-50],[9,-45],[15,-10],[20,-30],[13,-6],[-2,-20],[18,-30],[15,-5],[2,-5],[7,-20],[-7,-20],[18,-15],[-2,-25],[2,-10],[2,0],[0,-20],[11,-5],[9,-15],[9,-46],[-2,-15],[-53,-75],[-11,-50],[-31,-25],[-7,5],[-13,-11],[-9,6],[-22,5],[-13,10],[-9,0],[-9,5],[-13,-5],[-9,-10],[-8,-5],[-23,-41],[-6,5],[-5,10],[-6,0],[-9,26],[-7,0],[-8,15],[-7,-5],[0,5],[-11,10],[2,5],[9,10],[11,15],[0,30],[7,10],[0,15],[8,5],[-4,40],[-7,5],[5,5],[-9,46],[-22,15],[-11,15],[-7,5],[-17,20],[-42,15],[-29,20],[-9,55],[3,5],[6,0],[5,20],[6,0],[0,15],[-2,5],[-4,0],[-5,11],[9,15],[0,15],[-11,5],[-11,20],[-11,15],[-11,10],[6,25],[7,30],[9,20],[2,10],[11,10],[-2,15],[2,6],[-4,0],[4,25],[-4,5],[-20,0],[-2,5],[-14,20],[-8,5],[-7,15],[-15,15],[-18,50],[7,20],[-14,5],[-42,-20],[-4,-5],[-4,-10],[2,-15],[0,-5],[-13,-10],[-5,25],[-6,5],[-7,-10],[-20,55],[-17,-15],[-9,-5],[-20,-20],[-7,0],[0,-10],[-9,-15],[-26,-25],[-7,10],[-4,-5],[-2,0],[-11,0],[-7,-5],[-11,10],[-7,-15],[-8,0],[-5,0],[-4,-5],[-11,0],[-2,0],[-3,-15],[-8,-15],[-20,-25],[-7,0],[-13,-10],[-16,-21],[-19,-5],[-11,-10],[-7,0],[-15,-30],[-18,5],[-18,15],[-15,36],[-18,10],[-9,20],[-8,-10],[-5,5],[-31,-51],[11,-40],[-11,-10],[0,-10],[-8,-10],[-5,-15],[2,-10],[11,-5],[7,-5],[0,-35],[-2,-10],[-16,-25],[-6,-41],[0,-15],[-2,-10],[-27,-10],[-18,15],[-11,-5],[-15,20],[-2,15],[-11,15],[-11,-15],[-5,-20],[-11,5],[-9,-5],[-6,-5],[-5,-10],[-8,0],[-3,-5],[0,-10],[-11,-5],[-6,-10],[-13,-5],[-27,10],[-4,0],[-7,-5],[-20,40],[-6,-5],[-18,10],[-13,-10],[-7,5],[-15,-5],[-2,5],[-11,5],[-9,15],[-5,0],[-9,10],[-6,0],[-5,15],[-4,11],[-7,0],[-4,0],[-11,-21],[-26,36],[-5,10],[-4,5],[-7,15],[-2,5],[-5,10],[-4,5],[-4,15],[-14,25],[0,5],[0,5],[0,10],[-4,5],[-4,0],[-3,5],[0,10],[0,5],[-4,5],[-2,20],[0,15],[-2,5],[0,6],[-3,10],[0,10],[0,5],[-2,5],[-4,5],[-5,10],[-4,5],[-7,30],[-8,15],[-25,10],[-9,20],[-6,0],[-7,5],[-22,10],[-4,10],[4,20],[-4,15],[9,10],[6,26],[-4,10],[0,30],[-5,40],[-6,20],[-2,15],[-9,15],[-5,25],[9,56],[-2,25],[9,25],[-5,20],[3,25],[-3,30],[0,30],[11,15],[5,16],[-5,50],[-4,5],[-26,0],[-3,20],[27,5],[4,65],[-4,35],[4,15],[0,6],[-9,-6],[-8,-15],[-47,-35],[-11,-25],[-9,-20],[3,-15],[-5,-20],[0,-30],[-13,-15],[-11,-31],[-9,0],[-24,16],[-4,10],[-14,5],[-4,30],[-7,5],[0,10],[-6,0],[-5,10],[-4,0],[-9,25],[-7,0],[-4,35],[2,10],[7,5],[0,25],[-11,5],[-9,21],[-4,5],[-16,-31],[-9,5],[-26,-5],[-5,10],[-57,-10],[-13,-15],[-9,0],[-22,-20],[-18,0],[-8,-25],[0,-20],[-11,-20],[2,-10],[4,-15],[-2,-40],[-4,-5],[-3,-21],[5,-15],[6,-10],[-4,-10],[-9,-20],[-15,-20],[-7,-5],[-11,-5],[-13,0],[-5,-10],[-4,0],[4,-45],[-2,-25],[5,-10],[8,-15],[16,-21],[7,-15],[8,-5],[5,-10],[6,10],[5,0],[4,-25],[7,0],[2,-15],[0,-15],[4,-20],[-8,-10],[6,-5],[-4,-20],[-9,-15],[7,-30],[4,-10],[7,-6],[0,-10],[-7,-10],[-2,-15],[-5,0],[3,-10],[-3,-10],[-6,-5],[4,-10],[-2,-20],[4,-5],[11,-45],[16,-5],[13,-5],[4,-15],[-2,-15],[7,-31],[-16,-30],[-2,-10],[2,-20],[9,-20],[5,0],[-7,-20],[-2,-30],[-2,-5],[-20,-15],[-7,-25],[5,-15],[0,-41],[-27,-40],[-9,-40],[-19,-20],[0,-25],[-5,-20],[-15,-15],[4,0],[2,-21],[-9,-30],[5,-25],[-7,-20],[5,-15],[0,-25],[-5,-25],[-4,-10],[-16,0],[-8,5],[-22,-15],[-9,-5],[4,-26],[-6,-15],[-3,-35],[-11,-15],[-15,-5],[-11,-10],[-9,-45],[0,-15],[-7,-10],[0,-25],[7,-10],[-7,-15],[0,-26],[-17,-20],[-11,-25],[-20,5],[-11,5],[-16,-5],[-4,-5]],[[3875,8647],[0,5],[2,0],[2,0],[2,5],[3,0],[2,5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[5,0],[4,5],[2,0],[5,0],[22,5],[6,0],[3,0],[2,0],[4,0],[2,0],[0,5],[3,0],[2,0],[2,0],[0,5],[2,0],[2,5],[3,5],[2,0],[2,5],[4,0],[3,0],[4,5],[2,0],[2,0],[5,5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[2,0],[7,5],[4,0],[3,0],[2,0],[2,0],[0,5],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[3,5],[2,0],[4,5],[2,0],[3,0],[0,5],[2,0],[0,5],[0,5],[2,5],[2,0],[0,5],[0,5],[2,0],[3,0],[0,5],[2,0],[0,6],[2,0],[2,0],[0,5],[2,0],[3,5],[2,0],[2,0],[0,5],[2,0],[2,0],[0,5],[3,0],[0,5],[2,5],[2,5],[0,10],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[2,5],[0,5],[3,5],[2,10],[0,5],[2,5],[0,5],[2,0],[2,0],[3,5],[2,0],[2,0],[2,0],[2,0],[3,0],[4,-5],[4,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[3,-5],[2,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[2,0],[2,5],[5,5],[2,0],[2,0],[0,5],[2,0],[2,5],[3,0],[2,5],[2,0],[2,0],[2,0],[5,0],[4,0],[2,5],[3,0],[2,0],[2,0],[4,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[5,5],[4,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[4,-5],[2,-5],[3,-5],[2,-5],[2,0],[2,-5],[2,0],[0,-5],[3,0],[2,-5],[2,-10],[2,0],[2,-5],[3,-15],[2,-5],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[-2,-5],[0,-5],[0,-5],[-2,0],[-2,-11],[-3,-5],[0,-5],[-2,0],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[0,-5],[3,-5],[0,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[2,-5],[3,0],[0,-5],[2,0],[2,-5],[2,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[4,0],[5,0],[2,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,0],[2,0],[0,-5],[4,0],[5,-5],[4,0],[0,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[0,5],[3,0],[2,5],[2,5],[0,5],[2,0],[0,5],[0,5],[2,5],[0,5],[0,5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,5],[2,0],[0,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[4,-5],[4,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[5,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[6,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,0],[2,0],[6,-5],[3,0],[2,0],[2,-5],[4,-5],[3,0],[0,-5],[2,0],[2,0],[0,-5],[2,0],[2,0],[5,0],[2,-5],[2,0],[3,0],[2,5],[2,0],[2,0],[2,0],[0,5],[3,0],[2,0],[4,0],[2,0],[5,0],[2,0],[2,5],[2,0],[5,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[7,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,0],[2,0],[2,5],[2,5],[2,0],[5,5],[0,5],[2,0],[0,5],[2,0],[2,5],[3,-5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,6],[2,0],[3,-6],[2,0],[2,0],[2,-5],[2,-5],[3,-5],[2,0],[2,-5],[2,0],[0,-5],[2,0],[3,0],[0,-5],[4,0],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[0,5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,5],[2,0],[3,5],[2,0],[2,5],[2,5],[2,0],[0,5],[3,0],[0,5],[2,6],[0,5],[2,5],[0,10],[0,5],[0,5],[0,5],[0,5],[0,5],[2,5],[0,5],[0,5],[2,0],[0,5],[3,5],[2,5],[2,0],[0,5],[4,5],[3,0],[0,5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[5,0],[8,-5],[3,0],[2,0],[2,0],[2,0],[2,5],[5,0],[4,0],[2,0],[3,0],[2,0],[2,0],[2,0],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[0,5],[0,5],[3,0],[2,5],[2,0],[2,0],[2,0],[0,5],[3,0],[2,5],[2,0],[2,5],[2,0],[3,0],[2,0],[2,5],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,0],[5,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[0,5],[2,0],[3,5],[2,0],[2,5],[0,5],[2,0],[0,5],[2,5],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[3,0],[2,0],[6,5],[3,0],[2,0],[0,6],[2,0],[2,5],[2,5],[0,5],[3,5],[2,5],[2,5],[2,10],[0,5],[2,0],[0,5],[3,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,0],[2,0],[0,5],[2,0],[5,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,-5],[2,0],[2,0],[0,-5],[2,0],[0,-5],[0,-5],[3,0],[0,-5],[0,-5],[2,-5],[0,-5],[0,-5],[0,-5],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[2,5],[2,5],[3,0],[0,5],[2,0],[2,10],[2,0],[0,5],[2,0],[0,5],[3,0],[2,5],[2,0],[2,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[4,5],[5,0],[2,5],[2,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,-5],[0,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[2,-5],[3,0],[2,0],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[4,5],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[0,-5],[4,0],[2,0],[2,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,-5],[2,0],[4,-5],[3,0],[2,-5],[2,-5],[2,0],[0,-5],[-2,-6],[0,-5],[0,-5],[-2,-10],[0,-5],[-2,-10],[0,-5],[0,-5],[0,-5],[0,-5],[2,-5],[2,-5],[0,-5],[2,-5],[2,-5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,-5],[3,0],[4,0],[2,-5],[2,0],[3,0],[2,-5],[2,-5],[2,0],[2,-5],[3,0],[0,-5],[2,-5],[2,0],[2,-5],[0,-5],[2,-5],[3,0],[2,-5],[2,-5],[2,-5],[2,0],[3,-5],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[3,-5],[2,0],[2,0],[7,0],[2,0],[2,5],[2,0],[3,0],[2,0],[4,0],[5,0],[4,0],[7,-5],[2,0],[4,0],[2,0],[3,0],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,0],[2,0],[2,0],[5,-5],[2,0],[2,0],[2,0],[5,0],[4,0],[2,-5],[2,0],[3,0],[2,0],[2,-5],[4,0],[0,-5],[3,0],[0,5],[2,0],[2,5],[0,5],[2,0],[0,5],[0,5],[3,5],[0,5],[2,0],[0,5],[2,0],[0,5],[2,0],[0,5],[2,0],[3,5],[2,0],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[5,-5],[4,-5],[2,-5],[3,0],[2,0],[2,-5],[2,0],[5,-5],[2,0],[6,-5],[5,-5],[2,0],[2,0]],[[5982,9380],[2,0],[3,0],[0,5],[2,0],[2,0],[2,6],[2,0],[3,0],[2,0],[0,5],[2,0],[2,5],[2,0],[0,5],[5,5],[2,0],[4,5],[0,5],[3,0],[0,5],[2,0],[0,5],[2,0],[2,0],[2,0],[3,0],[2,0],[4,-5],[5,0],[2,-5],[2,0],[2,-5],[5,0],[0,-5],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,5]],[[6110,9421],[4,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[4,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[5,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[3,-5],[4,0],[2,0],[0,-5],[2,0],[3,0],[2,-6],[2,0],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[0,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[2,-5],[4,0],[2,-5],[3,0],[2,-5],[4,-5],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,5]],[[6434,9230],[4,0],[3,0],[2,0],[4,0],[2,0],[3,0],[0,-5],[2,0],[2,-5],[2,-5],[2,0],[5,-5],[2,-5],[5,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[5,5],[2,0],[2,0],[2,5],[5,0],[2,5],[2,0],[2,0],[5,0],[0,5],[4,0],[2,0],[3,0],[2,0],[4,5],[9,5],[11,5],[2,0],[2,5],[3,0],[11,0],[4,0],[2,0],[3,0],[0,5],[2,0],[2,0],[7,5],[2,5],[4,0],[7,10],[4,0],[2,5],[7,5],[4,0],[5,5],[2,5],[2,0],[2,0],[3,5],[2,0],[2,5],[4,5],[3,5],[2,0],[2,5],[4,5],[5,5],[2,5],[2,0],[2,5],[3,0],[2,5],[2,0],[5,5],[4,0],[11,10],[4,5],[3,5],[4,0],[2,0],[5,5],[2,0],[2,5],[4,0],[7,5],[7,5],[4,5],[4,0],[5,5],[2,0],[2,0],[5,0],[0,6],[2,0],[2,0],[2,0],[5,0],[2,0],[0,-6],[2,0],[2,0],[5,0],[11,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[7,0],[4,0],[2,0],[5,0],[2,0],[2,0],[4,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,0],[3,0],[2,-5],[2,-5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[7,0],[2,0],[2,0],[3,0],[2,0],[6,0],[5,0],[2,0],[2,0],[7,-5],[4,-5],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,0],[3,-5],[2,0],[2,-5],[2,-5],[2,-5],[3,0],[2,-5],[2,0],[0,-5],[7,-5],[4,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[3,0],[0,5],[2,0],[2,0],[0,5],[4,5],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[0,-5],[3,0],[6,0],[5,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[0,-5],[2,0],[3,-5],[2,-5],[4,-5],[3,-5],[4,-5],[2,-5],[2,-5],[5,0],[6,5],[3,-10],[13,10],[2,0],[9,5],[17,-5],[16,-5],[2,0],[68,10],[31,10],[18,0],[26,-15],[391,-307],[17,-25],[110,-216]],[[7759,8396],[-2,0],[-3,0],[-2,-5],[-9,-5],[-4,-5],[-7,-5],[0,-5],[5,20],[-13,5],[-9,5],[-7,0],[2,10],[-8,0],[0,5],[-5,5],[5,15],[-5,5],[2,15],[3,0],[6,-10],[2,0],[9,-5],[13,-5],[5,-5],[4,0],[2,-5],[3,-5],[2,-5],[4,-5],[5,-5],[2,-5],[0,-5]],[[5354,3185],[-7,40],[9,10],[-2,20],[15,11],[0,5],[-4,5],[-2,15],[-7,15],[2,10],[18,35],[-7,35],[0,15],[7,-5],[9,0],[4,-10],[22,5],[7,10],[13,-10],[27,20],[24,-10],[4,10],[16,55],[8,0],[9,16],[13,35],[9,10],[7,15],[11,10],[0,15]],[[7060,1768],[-4,-40],[-16,-5],[-13,-15],[-7,-15],[-13,-10],[-4,-15],[-13,-25],[-14,-51],[-9,0],[-8,0],[-18,-15],[-9,-15],[-2,-10],[-7,0],[-17,-10],[-9,-10],[-13,-10],[-16,-15],[5,-15],[13,-50],[20,-76],[0,-15],[-11,-40],[-5,-10],[-8,-10],[0,-35],[0,-15],[-9,-15],[-31,-6],[-11,6],[-11,0],[-11,-16],[-11,0],[-24,-30],[-16,0],[-4,-5],[-7,-10],[-2,-15],[4,-10],[-2,-10],[-18,-30],[-4,-35],[4,-15],[18,-31],[13,-25],[5,-75],[6,-35],[-11,-5],[-2,-15],[-7,-10],[-2,0],[-11,5],[-4,-5],[0,-25],[-5,-5],[-2,-5],[-9,-6],[-19,0],[2,-30],[-2,-10],[-7,5],[-2,-5],[-2,-5],[-3,10],[0,-15],[11,-20],[44,-25],[3,-50],[4,-10],[-11,-25],[7,-15],[11,-5],[4,-11],[-7,-50],[18,5],[7,-15],[15,0],[13,10],[7,-15],[7,-10],[2,-5],[-2,-5],[4,0],[7,0],[4,0],[7,0],[2,0],[-2,-20],[19,-20],[0,-10],[5,-5],[0,10],[7,5],[8,-10],[0,-10],[-4,-15],[4,-36],[22,16],[5,-5],[-5,-11],[5,-10],[-9,-5],[-7,-20],[-8,0],[-3,-5],[7,-10],[-7,-10],[3,-10],[-14,-15],[-13,-35],[-2,5],[-18,-5],[-4,-5],[0,-10],[-5,-10],[3,-10],[-5,-5],[-6,-20],[0,-20],[4,-16],[2,-10],[-9,-5],[7,-5],[-13,-10],[-2,-15],[-7,0],[-4,-15],[0,-5],[-7,-5],[0,-10],[4,-25],[-8,-15],[2,-5],[-5,-30],[-4,0],[9,-10],[-7,-10],[-6,0],[-16,5],[-7,-15],[-2,-5],[-31,10],[-13,15],[-9,-5],[-2,5],[5,10],[2,35],[4,0],[-2,15],[-7,-5],[-8,5],[2,5],[-9,15],[-11,-15],[-13,5],[-3,-5],[3,-5],[-7,-15],[-2,5],[-5,-5],[-6,15],[-13,5],[2,15],[-13,15],[0,5],[-7,0],[-9,5],[-4,-5],[-18,-10],[-11,-10],[-4,-10],[0,-5],[-7,-5],[0,-10],[-18,5],[-19,-15],[4,55],[40,96],[15,15],[13,15],[-4,10],[-2,5],[-11,-10],[-7,15],[2,5],[-6,65],[-11,35],[-7,0],[-2,20],[-2,0],[-3,5],[5,5],[4,16],[0,10],[-11,30],[-9,25],[-4,20],[-13,0],[-27,45],[-6,25],[0,25],[9,26],[0,65],[-7,20],[-27,-10],[-13,10],[-15,10],[-9,20],[-11,5],[-13,20],[-11,15],[-5,15],[-6,10],[0,10],[-2,6],[-3,5],[-2,0],[-2,5],[-11,10],[-7,15],[-17,0],[-9,0],[-5,0],[-8,15],[-5,-5],[-2,0],[-9,5],[-15,0],[-7,5],[-7,0],[-2,0],[0,-5],[-2,-5],[-4,-5],[-9,0],[15,95],[9,20],[20,51],[31,15],[17,45],[5,40],[6,-5],[5,15],[-16,15],[16,20],[20,-15],[24,71],[-7,70],[-11,0],[-11,20],[-20,15],[-15,35],[-2,-5],[-5,10],[-2,5],[0,5],[-2,5],[-7,0],[0,5],[-6,10],[-5,5],[-15,15],[-9,-20],[-4,-10],[-38,-5],[-13,15],[-7,10],[-13,10],[-2,0],[-7,0],[-6,0],[-5,5],[-6,16],[-31,85],[-40,-60],[-20,-66],[-37,20],[-9,5],[-7,0],[-4,0],[-2,0],[-5,0],[-2,11],[-2,5],[-2,0],[-2,5],[0,10],[-5,0],[2,5],[0,5],[-4,5],[-4,-5],[-5,0],[-4,0],[-5,-5],[-4,0],[-24,20],[-5,15],[-17,35],[-60,-5],[-20,0],[0,5],[-4,20],[0,30],[-11,10],[-5,15],[-15,26],[-7,0],[3,5],[-3,5],[3,10],[6,5],[7,5],[0,5],[0,15],[2,0],[7,5],[-3,10],[-6,0],[-11,0],[-7,5],[-4,0],[-2,0],[-3,0],[3,10],[-5,5],[2,5],[-4,10],[-4,0],[-5,0],[-6,-5],[-3,0],[-2,5],[-4,5],[-5,5],[-6,60],[-14,36],[-11,10],[-11,0],[3,5],[-5,25],[-26,30],[-11,30],[-7,70],[-24,20],[-11,-10],[-7,0],[-9,10],[-17,21],[-20,15],[-13,5],[-20,0],[-22,15],[-5,15],[-2,25],[-2,20],[-7,0],[-13,10],[-17,5],[-7,5],[-2,15],[-2,10],[4,5],[4,15],[5,0],[0,15],[17,15],[-13,51],[-35,70],[0,20],[-13,30],[4,15],[5,5],[19,10],[-4,16],[7,15],[-3,30],[7,15],[22,10],[4,30],[9,10],[11,25],[-2,15],[0,40],[-4,46],[4,10],[2,10],[11,20],[-6,30],[-3,60],[-11,36],[22,45],[-15,35],[-2,15],[11,30],[-11,30],[-11,10],[-2,15],[0,10],[6,31],[-4,5],[0,15],[2,10],[11,10],[4,20],[-2,10],[-9,5],[3,25],[-11,10],[-9,10],[-2,20],[-5,15],[-9,10],[-15,-5],[-2,5],[-16,-5],[-22,-10],[-9,-10],[-6,0],[-16,-5],[-11,-15],[-13,0],[-6,-15],[-9,5],[-9,-5]],[[6637,728],[4,-5],[16,0],[6,45],[-4,5],[-2,20],[4,36],[-2,0],[-22,5],[-20,-96],[20,-10]],[[628,2642],[-62,46],[-13,10],[-11,0],[-5,5],[-4,20],[-7,5],[-11,-5],[-4,0],[-2,5],[-7,10],[-9,10],[-13,-15],[4,-10],[-11,-10],[5,-15],[4,-5],[13,-5],[12,-20],[6,5],[2,-5],[5,-5],[2,5],[4,0],[-4,-26],[24,-25],[0,5],[7,-10],[55,-35]],[[608,2577],[-27,-95]],[[581,2482],[-46,-141],[-62,50],[-24,20],[-15,5],[-5,10],[-22,20],[-13,21],[-2,10],[-13,15],[2,5],[-7,5],[2,5],[-2,0]],[[374,2507],[-2,10],[4,10],[9,10],[0,10],[7,15],[2,0],[2,20],[5,5],[2,0],[0,10],[-5,5],[3,5],[2,5],[-2,0],[2,5],[2,0],[2,5],[7,5],[4,0],[0,5],[7,5],[7,16],[0,5],[4,5],[7,10],[2,5],[0,15],[2,20],[2,0],[2,10],[20,30],[0,5],[-11,25],[-6,10],[-5,25],[-2,5],[-4,-10],[-3,0],[-4,-5],[-9,0],[-31,56],[-48,60],[-2,-5],[4,-10],[-2,0],[-11,10],[-7,5],[-13,25],[-4,20],[-69,30],[-6,5],[13,45],[9,16],[2,20],[20,40],[2,5],[2,10],[-4,20],[-20,30],[4,20],[-9,15],[3,15],[-3,15],[9,11],[44,70],[36,141],[17,35],[38,70],[11,-15],[2,0],[20,45],[-9,10],[15,30],[-39,66],[-60,95],[24,35],[9,25],[29,41],[7,5],[15,20],[11,10],[15,30],[11,0],[20,20],[9,10],[2,20],[20,25],[5,0],[11,15],[0,10],[11,21],[-3,0],[9,10],[5,-5],[4,5],[11,25],[9,5],[0,5],[4,10],[2,0],[18,15],[13,35],[51,75],[24,31],[0,10],[5,5],[2,0],[-5,5],[0,15],[3,0],[17,20],[11,15],[29,20],[4,0],[20,25],[38,35],[9,0],[30,20],[16,21],[6,5],[5,15],[6,10],[7,15],[11,-5],[4,5],[12,5],[-3,25],[-6,0],[4,5],[11,5],[9,0],[11,0],[2,5],[9,15],[7,15],[-3,15],[-6,10],[15,25],[13,15],[7,-5],[4,0],[25,16],[15,5],[13,15],[3,0],[17,30],[-2,5],[2,10],[0,5],[22,30],[7,5],[0,25],[13,45],[-35,51],[-16,15],[0,5],[-8,50],[22,20],[-3,40],[7,40],[37,101]],[[1110,5195],[12,-5],[2,-15],[35,-5],[64,35],[9,5],[17,10],[11,10],[22,40],[18,10],[13,20],[16,6],[9,10],[15,15],[11,5],[26,20],[14,0],[11,0],[17,15],[7,0],[13,10],[13,0],[14,0],[6,15],[36,70],[2,25],[33,36],[13,10],[37,30],[80,50],[-2,-10],[2,-10],[4,-5],[-13,-75],[0,-51],[9,-5],[42,-50],[0,-15],[-5,-35],[0,-5],[3,0],[2,5],[0,-5],[-2,-25],[-14,-56],[16,20],[31,-5],[6,-10],[51,-80]],[[2005,5481],[67,81]],[[2788,2567],[-44,-80],[-27,-46],[0,-45],[18,-30],[-6,-5],[2,-10],[-11,-5],[-9,-10],[6,-50],[0,-10],[-11,-10],[-6,-5],[-2,5],[-5,-5],[-13,-26],[0,-10],[-7,-5],[-15,-30],[-15,-5],[-7,-20],[-2,-25],[-2,-5],[-12,-10],[-4,-5],[-7,-10],[-11,-5],[-11,0],[-8,0],[-3,0],[-2,-20],[-4,-20],[-2,-20],[4,-6],[-7,-5],[-8,-20],[-3,-10],[-15,-25],[-9,-10],[-18,-15],[-17,-25],[-18,-10],[-4,-5],[-5,5],[-11,5],[-15,-10],[-11,-15],[-13,-10],[-3,-5],[-6,-5],[-9,-5],[-9,-5],[-2,-5],[-13,-5],[-2,-5],[-3,5],[0,5],[0,5],[-2,0],[-2,5],[-2,10],[-7,10],[-2,10],[-4,15],[-5,0],[-2,10],[-2,0],[-5,5],[-2,5],[-2,0],[-4,5],[0,10],[0,5],[-5,10],[0,10],[0,10],[0,10],[-2,10],[0,5],[0,10],[-2,0],[-3,5],[-4,0],[-2,0],[-2,5],[-3,5],[0,11],[0,5],[0,5],[0,5],[-2,5],[0,5],[-2,5],[-9,15],[-2,0],[0,5],[-2,10],[-2,5],[-3,10],[-2,5],[0,5],[-4,5],[-2,0],[0,5],[0,5],[-3,20],[0,5],[-2,5],[-9,15],[-8,10],[-14,25],[-4,5],[-2,5],[-7,16],[-4,5],[-3,5],[0,10],[-2,30],[0,5],[-2,10],[-2,10],[-2,10],[-3,0],[-6,15],[-5,10],[-11,10],[-2,5],[-6,5],[-5,5],[-6,5],[-5,10],[-4,10],[0,5],[0,5],[0,10],[0,5],[-2,11],[-3,5],[0,10],[0,10],[-2,5],[0,5],[-2,10],[0,5],[0,15],[0,10],[0,5],[0,10],[0,5],[0,5],[-2,10],[-2,10],[-5,10],[-6,10],[-5,10],[-4,5],[-2,5],[-3,5],[-2,0],[-2,0],[0,5],[-5,0],[-4,-5],[-2,0],[-2,0],[-5,0],[-6,0],[-5,0],[-6,0],[-3,0],[-2,0],[-2,0],[-2,5],[-2,0],[-3,5],[-2,5],[-6,26],[-5,10],[-2,5],[-4,5],[-3,0],[-2,5],[-2,5],[-2,5],[0,5],[0,5],[0,5],[9,30],[0,5],[2,5],[0,15],[-2,10],[0,5],[0,10],[-3,10],[-2,5],[-2,10],[-2,0],[-2,5],[-5,5],[-4,5],[-2,0],[-3,0],[-2,5],[-4,5],[-5,10],[-2,5],[-4,11],[-9,15],[-2,0],[-3,10],[-4,5],[-84,165]],[[1906,3059],[-306,136],[-359,10],[-205,-201],[-201,-60],[-181,-221],[-26,-81]],[[1847,4612],[-2,-10],[-5,-5],[0,-10],[-6,-10],[0,-5],[11,-10],[6,0],[9,5],[4,-5],[5,5],[4,0],[7,0],[4,5],[13,25],[25,10],[4,0],[7,0],[11,-10],[17,-25],[14,-10],[11,0],[4,0],[7,-5],[2,5],[4,-5],[7,15],[-5,5],[3,10],[-3,5],[0,5],[23,55],[4,10],[9,20],[-5,10],[-8,11],[2,10],[-11,10],[-9,10],[-7,15],[-2,0],[-4,-5],[-3,0],[-2,0],[0,-5],[-2,0],[-2,10],[4,5],[0,10],[-6,10],[-3,10],[-4,10],[-7,0],[3,10],[-7,5],[-7,-20],[7,0],[-11,-30],[-7,-10],[-8,-10],[-18,-25],[-2,-10],[4,0],[-2,-5],[-16,-31],[-2,-15],[-13,-15],[4,-10],[-2,-5],[-4,-5],[-5,0],[-2,0],[-2,0],[-4,-5],[-3,0],[-2,-5],[-4,10],[-13,-15],[-3,10],[-4,-5],[-2,5]],[[471,2653],[-6,-16],[11,-10],[2,0],[0,5],[-2,5],[0,5],[2,5],[2,6],[2,5],[16,-16],[4,11],[-18,25],[-4,-10],[-2,0],[-7,-15]],[[2144,5702],[161,171],[84,-35]],[[5354,3185],[-9,-5],[-4,0],[-9,10],[-9,0],[-9,-5],[-22,-20],[-6,-10],[-7,-25],[-18,-20],[-4,-15],[-7,-10],[-11,-10],[-11,-16],[-4,-10],[-9,0],[-7,0],[-8,-10],[-9,0],[-7,15],[-9,-15],[-4,-10],[-4,-20],[-5,-15],[-11,-20],[-9,-5],[5,-10],[4,0],[5,-10],[8,0],[11,-10],[5,-5],[9,10],[2,-10],[11,-15],[2,-10],[0,-10],[-7,-15],[0,-15],[11,-16],[-8,-10],[-3,-20],[-2,-15],[-13,-10],[-11,5],[-13,-25],[-18,-20],[-11,-15],[-20,15],[-22,-15],[-6,-15],[8,-20],[-2,-5],[5,-20],[-14,-15],[7,-15],[-7,-6],[-15,6],[-9,-6],[0,-20],[-18,-5],[-4,0],[-7,5],[-8,-15],[-18,-20],[2,-5],[-6,-15],[2,-5],[0,-10],[4,-5],[-6,-15],[-16,-15],[0,-20],[-9,-15],[3,-15],[-16,-20],[-13,-21],[-11,5],[-16,-10],[-17,-15],[-9,0],[-31,-10],[-9,5],[-20,20],[-15,5],[-7,0],[-24,-35],[-4,-5],[-11,-10],[-5,-25],[-6,-15],[-5,-15],[-15,-5],[-20,-45],[-24,-20],[0,-26],[-5,-5],[-6,0],[2,-15],[13,-20],[27,-5],[4,-15],[18,0],[6,-55],[7,-15],[9,0],[9,-30],[19,-20],[14,0],[8,-71],[18,-45],[2,-30],[-2,-5],[4,-25],[9,-5],[18,-41],[0,-25],[-15,-15],[-3,-25],[-13,-20],[-2,-20],[0,-20],[6,-15],[0,-30],[5,0],[-11,-36],[-13,-20],[-11,-10],[-7,10],[-22,-10],[-26,-25],[2,-15],[-2,-15],[2,-10],[-2,-25],[-9,-10],[-3,-10],[-4,-10],[-18,0],[-4,-10],[-4,0],[-14,-10],[-8,0],[-11,-5],[-7,0],[-15,5],[-20,-15],[-7,-5],[-20,0],[-11,-11],[-22,0],[-2,-10],[2,-20],[-9,-25],[0,-15],[-2,-30],[-15,-30],[2,-15],[-2,-10],[4,-15],[0,-20],[9,-36],[9,-45],[4,-5],[2,-10],[-6,-10],[-16,-5],[-6,-10],[-22,-40],[4,-5],[9,-25],[-16,-31],[5,-15],[-2,-20],[-11,-5],[-14,5],[-2,-20],[-13,-30],[0,-10],[-11,-20],[-26,15],[-7,0],[-13,-5],[-11,0],[-7,-5],[-4,-5],[-20,10],[-18,-5],[-17,-5],[-7,5],[-7,0],[-17,-5],[-22,5],[-7,-10],[0,-10],[-4,-20],[-7,-5],[-13,-30],[-2,-16],[-36,-30],[0,-5],[5,-10],[2,-30],[-7,-10],[0,-10],[-6,-10],[6,-20],[-2,-25],[-13,-5],[-7,-56],[7,-15],[13,-35],[-9,-30],[-4,-5],[-11,0],[-5,-15],[-13,20],[-17,-5],[-20,10],[-9,0],[-11,15],[-22,10],[-7,0],[-11,-15],[-9,-5],[-13,-20],[-9,-10],[-13,15],[-4,20],[-11,15],[-22,15],[-18,35],[-40,16],[-6,5],[-11,-46],[-16,-20],[-2,-20],[-33,0],[-15,25],[-3,20],[-8,10],[4,66],[-7,15],[-11,10],[-11,10],[-17,0],[-16,10],[-9,20],[-2,20],[-6,10],[-14,35],[-8,10],[-11,5],[-7,0],[-4,-10],[-9,0],[-14,-15],[-15,-10],[-37,10],[-14,0],[-8,-15],[-36,10],[-15,0],[-13,20],[0,25],[-5,26],[-9,10],[-17,0],[-11,-5],[-27,0],[-4,-5],[-5,-5],[-4,-21],[-4,-20],[2,-25],[6,-45],[-6,-25],[-11,-10],[-7,10],[-15,0],[-11,5],[-11,25],[-5,-5],[-9,-15],[-8,0],[-9,5],[-11,15],[-7,-10],[0,-15],[-9,-10],[-8,0],[-22,-15],[-7,-10],[-7,-15],[5,-40],[2,-16],[-7,-15],[-6,0],[-9,5],[-13,5],[-7,-15],[-22,-5],[-9,-15],[-2,-5],[-15,-40],[-16,-25],[-11,0],[-2,-15],[-13,-5],[-9,-10],[-11,0],[-9,10],[-9,-15],[0,-15],[-15,-31],[-18,-10],[-15,21],[-5,5],[-17,10],[-11,-5],[-11,20],[0,20],[-11,5],[-16,15],[-26,-20],[-18,-5],[-13,10],[-5,25],[-22,5],[-8,-5],[-9,15],[-7,10],[-9,-10],[-4,-10],[-9,-15],[0,-10],[-9,-25],[-9,-35],[-13,-5],[-31,-61],[-8,0],[-3,20],[-6,5],[-20,-15],[-16,5],[-8,5],[-7,-10],[-7,0],[-11,-5],[-4,-10],[0,-15],[-11,-10],[-2,-5],[-9,-5],[-4,-15],[-9,-5],[-5,-30],[0,-15],[7,-20],[-9,-15],[-13,-5],[-16,5],[-11,15],[-8,0],[-29,40],[0,10],[7,5],[-3,10],[-6,10],[-7,5],[-9,0],[-15,-10],[-13,-10],[-3,-5],[-6,0],[-7,-10],[-2,-20],[-7,-5],[-6,-10],[-9,-5],[-11,-20],[-9,0],[-2,-5],[-11,0],[-11,5],[-5,0],[-6,10],[-5,30],[-2,10],[-6,10],[4,10],[0,10],[-20,35],[-11,10],[-9,25],[3,25],[-9,0],[-7,15],[-13,11],[0,10],[0,35],[-7,20],[-17,10],[-5,15],[-4,5],[-2,5],[-3,5],[-2,0],[-2,5],[-7,45],[-6,10],[-7,25],[2,16],[0,15],[5,5],[0,10],[-5,30],[3,5],[-3,5],[-4,5],[-26,10],[-11,10],[-3,5],[-17,40],[2,20],[2,0],[9,10],[13,5],[5,10],[0,5],[0,5],[-3,6],[-4,5],[0,10],[-9,15],[-9,0],[0,10],[0,15],[-4,15],[2,10],[-11,20],[-2,0],[-9,-10],[-2,0],[-9,5],[-11,15],[-2,0],[-9,5],[-2,5],[0,5],[0,10],[-9,50],[0,10],[-22,31],[-9,25],[-9,0],[-17,55],[-11,50],[-16,-5],[-9,10],[-4,10],[-2,0],[-2,5],[0,10],[4,10],[-2,11],[4,5],[0,5],[-2,5],[-9,10],[-2,-10],[-9,-5],[-9,5],[-13,-31],[-7,-10],[-2,-10],[-4,-5],[-2,0],[0,-10],[-5,-5],[-4,-5],[-27,-10],[-6,-15],[-2,-15],[-9,15],[-9,-5],[-15,20],[0,5],[-7,15],[0,20],[18,66],[6,10],[9,10],[7,5],[-7,25],[7,15],[2,15],[-7,10],[-2,10],[-11,25],[0,5],[7,10],[2,5],[2,10],[7,16],[6,20],[2,5],[-4,25],[7,25],[2,15],[6,10],[-2,5],[-2,0],[-7,0],[-11,5],[-17,-10],[-5,0],[-8,15],[-16,-5],[-20,5],[-20,5],[-17,10],[-2,15],[-7,5],[-44,-10],[-9,-10],[-4,15],[-5,0],[-2,5],[-4,15],[-3,5],[-13,-10],[-6,10],[-7,56],[-11,30],[7,30],[-3,15],[31,50],[2,25],[11,15],[0,5],[-11,71],[-6,35],[9,40],[4,5],[0,10],[7,5],[8,25],[7,5],[4,10],[-2,36],[0,10],[14,10],[8,0],[14,35],[2,20],[4,15],[9,5],[7,5],[11,10],[6,15],[0,20],[11,36],[-2,40],[13,30],[0,5],[-2,10],[0,5],[-9,15],[-2,5],[0,10],[0,5],[-2,0],[-9,5],[-4,0],[-3,-10],[-8,0],[-5,5],[-2,15],[-9,5],[-9,10],[-4,15],[-7,0],[-4,5],[-2,10],[4,16],[-11,30],[-9,5],[-4,10],[-7,5],[-9,10],[-8,10],[-3,5],[-8,-5],[-3,0],[-2,0],[-2,5],[-4,25],[-3,5],[5,10],[-5,10],[-2,10],[-17,-5],[-7,5],[-2,0],[0,15],[-7,25],[-4,15],[-9,16],[-7,15],[-4,25],[4,30],[9,15],[11,10],[24,5],[20,40],[7,10],[4,15],[0,15],[-4,5],[-5,16],[3,25],[4,10],[35,165]],[[1110,5195],[3,50],[4,71],[2,70],[-13,55],[-24,50],[-13,36],[-11,20],[-7,30],[26,25],[31,50],[7,20],[18,35],[4,11],[2,5],[18,35],[11,15],[11,20],[13,15],[18,-40],[2,0],[29,25],[41,15],[34,20],[22,5],[11,10],[11,5],[24,30],[17,15],[9,10],[29,-10],[18,5],[2,0],[35,31],[13,25],[9,20],[20,70],[11,25],[44,45],[20,11],[22,0],[4,10],[7,5],[9,20],[6,5],[7,15],[13,15],[2,0],[3,5],[-16,5],[-4,5],[-5,20],[-2,0],[-6,5],[-9,0],[-5,15],[-4,5],[-4,0],[-7,15],[4,15],[14,5],[6,15],[7,5],[0,5],[-2,5],[6,16],[-11,10],[2,5],[7,5],[15,15],[0,5],[5,5],[13,5],[9,15],[11,-10],[18,0],[8,10],[7,20],[0,15],[-11,25],[-2,25],[4,5],[5,0],[8,0],[9,25],[29,26],[11,5],[11,0],[9,10],[24,15],[4,5],[14,10],[4,0],[11,5],[4,5],[5,20],[13,0],[4,15],[7,10],[11,10],[2,10],[7,10],[4,0],[20,20],[0,15],[2,5],[3,0],[15,10],[2,0],[5,16],[15,30]],[[1990,6768],[4,5]],[[581,2482],[47,-36],[4,-5],[2,0],[11,-10],[-4,-10],[4,-10],[-2,-10],[5,0],[-5,-10],[7,-5],[0,-5],[2,0],[2,-10],[-4,-10],[-5,-5],[-6,-10],[-5,0],[-4,0],[-4,-15],[-5,0],[2,-10],[-2,-15],[0,-5],[11,-15],[13,-51],[3,-5],[24,-35],[-2,-15],[8,-5],[7,-15],[27,15],[0,10],[13,10],[-2,5],[4,5],[13,30],[7,11],[4,-6],[-6,-30],[2,-10],[2,0],[11,-5],[4,0],[9,5],[7,0],[-2,-5],[-7,-20],[7,-5],[0,-15],[2,-15],[-35,-95],[-5,-11],[-35,-40],[-16,-10],[-6,0],[-27,-20],[-11,-20],[-6,10],[-2,0],[0,-10],[-5,0],[-6,0],[-7,5],[-7,0],[-9,-10],[-4,-5],[-2,-5],[-5,0],[-2,-5],[-4,0],[0,-10],[-9,-5],[-9,-20],[-2,0],[-2,-5],[-11,-5],[-11,-25],[-7,-10],[-2,-5],[-4,0],[-11,-16],[-5,0],[-6,-15],[6,-60],[-31,-40],[-15,-5],[-35,-25],[-9,-15],[-2,-15],[-5,-5],[-6,10],[-3,-10],[-9,-10],[-2,-11],[-20,-5],[-13,16],[-26,0],[-11,5],[-11,0],[-16,40],[-35,-15],[-2,0],[-7,5],[-44,5],[-6,-20],[-5,-20],[5,-11],[-3,0],[-4,-5],[-7,5],[-15,-20],[0,-10],[-2,10],[-3,-5],[0,10],[-2,5],[-2,-5],[0,5],[-7,0],[-2,5],[-6,0],[-3,5],[-2,5],[-17,6],[-5,-6],[-2,0],[-7,6],[-11,-6],[-22,11],[-2,0],[-2,0],[-11,-5],[-5,0],[-4,-6],[-2,-25],[-5,-5],[-8,-15],[-7,-5],[-7,0],[-11,-10],[-8,0],[-9,-10],[-2,20],[22,25],[2,10],[-5,15],[0,16],[9,35],[9,20],[7,20],[11,35],[2,30],[4,5],[2,0],[5,-15],[2,0],[4,20],[5,10],[0,10],[6,20],[-8,21],[-14,10],[-6,10],[-40,30],[0,5],[5,5],[4,5],[11,15],[-9,20],[11,40],[9,10],[15,0],[18,-10],[2,15],[-6,20],[11,0],[8,-5],[0,-5],[5,5],[11,10],[0,21],[7,5],[0,5],[8,0],[-2,10],[5,0],[4,5],[4,0],[14,5],[19,25],[18,-25],[9,-10],[11,20],[4,20],[16,30],[2,0],[4,5],[11,-20],[5,-5],[4,5],[2,-5],[3,10],[13,15],[6,-5],[3,10],[4,-5],[4,5],[0,-5],[31,-40],[9,15],[2,0],[5,-5],[2,0],[31,55],[0,10],[-7,5],[5,10],[-3,15],[-4,10],[-4,15],[4,6],[-7,5],[-2,0],[-13,20],[7,10],[-20,30],[2,30],[-7,5],[20,30],[5,15],[2,5],[6,-5],[5,0],[2,5],[-2,0],[0,5],[4,5],[-2,5],[4,10],[-6,10],[4,26],[-4,5],[2,20],[9,20],[0,5],[4,0]],[[502,2653],[-4,-11],[-16,16],[-2,-5],[-2,-6],[-2,-5],[0,-5],[2,-5],[0,-5],[-2,0],[-11,10],[6,16],[7,15],[2,0],[4,10],[18,-25]],[[628,2642],[-20,-65],[-55,35],[-7,10],[0,-5],[-24,25],[4,26],[-4,0],[-2,-5],[-5,5],[-2,5],[-6,-5],[-12,20],[-13,5],[-4,5],[-5,15],[11,10],[-4,10],[13,15],[9,-10],[7,-10],[2,-5],[4,0],[11,5],[7,-5],[4,-20],[5,-5],[11,0],[13,-10],[62,-46]],[[1990,6768],[0,5],[-11,5],[-11,-5],[-9,0],[-6,10],[-3,15],[9,10],[18,15],[2,5],[2,0],[5,0],[17,15],[5,20],[2,5],[15,0],[-2,25],[2,5],[0,10],[5,5],[4,10],[5,21],[13,20],[4,0],[2,5],[9,10],[29,35],[9,20],[2,0],[6,5],[20,15],[5,10],[2,5],[2,15],[11,10],[16,5],[6,15],[0,5],[2,15],[9,5],[9,16],[7,5],[2,5],[-7,15],[-11,15],[-2,15],[0,5],[7,10],[4,20],[0,10],[-4,20],[4,15],[-13,50],[-2,11],[-9,25],[9,15],[4,10],[13,5],[20,-5],[13,5],[11,-5],[5,0],[2,10],[2,15],[16,-5],[11,10],[17,-5],[16,25],[6,0],[2,0],[5,10],[2,25],[7,10],[4,20],[-4,30],[-9,6],[0,15],[35,10],[18,10],[20,-10],[6,5],[25,35],[-3,5],[-6,0],[0,10],[4,5],[9,10],[7,20],[-14,10],[-13,5],[2,15],[5,10],[-7,45],[-2,6],[-13,10],[-20,0],[0,20],[-2,10],[-11,-5],[-14,5],[-4,0],[-4,5],[0,10],[-7,0],[-4,-10],[-3,10],[-2,0],[-11,-25],[-22,-25],[-13,0],[-16,0],[-19,-16],[-3,0],[-4,5],[-7,-10],[-6,0],[-3,5],[-6,-5],[-18,0],[-4,5],[-20,-10],[-15,0],[-5,0],[-17,-10],[-9,-5],[-5,5],[-6,5],[-22,10],[-9,0],[-2,0],[-5,-5],[-6,5],[-5,-15],[-20,-15],[-11,-5],[-2,25],[9,26],[4,25],[-2,30],[27,35],[-3,10],[20,0],[2,5],[16,15],[4,15],[-4,5],[-5,30],[11,5],[7,31],[-9,10],[7,0],[4,5],[5,-5],[9,5],[28,0],[2,0],[5,30],[2,20],[-2,70],[-5,20],[36,5],[6,-5],[13,10],[5,10],[9,46],[6,0],[18,10],[9,-5],[9,0],[2,0],[9,5],[2,0],[15,25],[-2,10],[-7,5],[0,15],[7,10],[-2,10],[0,15],[-18,-5],[-2,10],[4,15],[-8,10],[-5,15],[5,25],[-3,31],[-4,25],[-7,5],[0,5],[7,0],[7,5],[24,20],[2,5],[35,20],[16,0],[6,-15],[20,-10],[2,-10],[18,5],[13,-15],[20,0],[24,-15],[3,-10],[6,-10],[11,5],[27,30],[11,0],[6,-5],[27,5],[9,10],[26,35],[4,-5],[18,-5],[27,-25],[6,-5],[9,-20],[4,-5],[3,-5],[4,0],[15,-5],[5,0],[33,10],[22,15],[11,0],[2,-10],[-24,-20],[0,-10],[-9,-16],[-4,-25],[-16,-50],[2,-20],[0,-5],[0,-10],[-2,-5],[0,-10],[-11,-60],[-6,-15],[22,-6],[26,-15],[9,-20],[22,0],[44,25],[13,-5],[9,-10],[7,-15],[-3,-20],[3,-5],[0,-5],[9,0],[4,-5],[0,-5],[2,-15],[0,-15],[18,20],[35,15],[29,40],[6,0],[14,-10],[8,10],[9,5],[7,15],[20,-5],[28,5],[2,5]]]} \ No newline at end of file From 9e3d8ac4e919d1eff026e94cbb9c69a21a25f9d0 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 09:58:14 +0300 Subject: [PATCH 033/227] Update Batchfile color. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index ae0584a1..157ba092 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -291,7 +291,7 @@ Batchfile: - .cmd tm_scope: source.dosbatch ace_mode: batchfile - color: "#92C2FF" + color: "#A3D300" Befunge: type: programming From 827ad80311fe24b4cabd76769c8ccff584a31557 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 10:16:37 +0300 Subject: [PATCH 034/227] Update colors to fix collision. Colors basically incremented. --- lib/linguist/languages.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 157ba092..be44415d 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -631,7 +631,7 @@ Common Lisp: Component Pascal: type: programming - color: "#b0ce4e" + color: "#c1df5f" extensions: - .cp - .cps @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#76B900" + color: "#87CA11" Cycript: type: programming @@ -1210,7 +1210,7 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text - color: "#84BA40" + color: "#95CB51" Grammatical Framework: type: programming @@ -1714,7 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text - color: "#689DD7" + color: "#79AEE8" LOLCODE: type: programming @@ -1778,7 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less - color: "#2A4D82" + color: "#3B5E93" Lex: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#DDDDDD" + color: "#EEEEEE" Mask: type: markup @@ -2027,7 +2027,7 @@ Maven POM: filenames: - pom.xml ace_mode: xml - color: "#FF6804" + color: "#007915" Max: type: programming @@ -2217,7 +2217,7 @@ Nginx: aliases: - nginx configuration file ace_mode: text - color: "#009900" + color: "#11AA11" Nimrod: type: programming @@ -2276,7 +2276,7 @@ NumPy: - .numsc tm_scope: none ace_mode: text - color: "#378EC8" + color: "#489FD9" OCaml: type: programming @@ -2779,7 +2779,7 @@ QMake: R: type: programming - color: "#198ce7" + color: "#2A9DF8" aliases: - R - Rscript @@ -3694,7 +3694,7 @@ XML: - Web.Release.config - Web.config - packages.config - color: "#25AAE2" + color: "#36BBF3" XPages: type: programming @@ -3740,7 +3740,7 @@ XSLT: - .xsl tm_scope: text.xml.xsl ace_mode: xml - color: "#0E76BD" + color: "#1F87CE" Xojo: type: programming @@ -3773,7 +3773,7 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml - color: "#FF0000" + color: "#001111" Yacc: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#92278F" + color: "#A33890" Zephir: type: programming @@ -3866,7 +3866,7 @@ reStructuredText: - .rst - .rest ace_mode: text - color: "#000000" + color: "#444444" wisp: type: programming From dc41dd888d4f6b3754fe6461d683360d2ed212d4 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 13:31:51 +0300 Subject: [PATCH 035/227] Update Cuda color to fix closeness. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index be44415d..3e0d1f8c 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#87CA11" + color: "#98DB22" Cycript: type: programming From 9a76cfc85f8a30a79bcedefcb66e4f676f8a7b5a Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 14:16:12 +0300 Subject: [PATCH 036/227] Update some colors to fix closeness. I have used syntactic color values with respect to the table below: A | B C | D | E | F G | H | I | J K | L M | N O | P Q | R S | T U | V W | X | Y Z 0 1 2 3 4 5 6 7 8 9 A B C D E F For example for Gradle the color should be 4B0283, for Cuda the color should be 1C201C(for six-letter CudaCu) and for reStructuredText the color should be B3BCBC(for six-letter reStru). --- lib/linguist/languages.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 3e0d1f8c..40ac5b40 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#98DB22" + color: "#1C201C" Cycript: type: programming @@ -1210,7 +1210,7 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text - color: "#95CB51" + color: "#4B0283" Grammatical Framework: type: programming @@ -1778,7 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less - color: "#3B5E93" + color: "#83BB83" Lex: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#EEEEEE" + color: "#80B729" Mask: type: markup @@ -2217,7 +2217,7 @@ Nginx: aliases: - nginx configuration file ace_mode: text - color: "#11AA11" + color: "#9469E9" Nimrod: type: programming @@ -2276,7 +2276,7 @@ NumPy: - .numsc tm_scope: none ace_mode: text - color: "#489FD9" + color: "#9C8AF9" OCaml: type: programming @@ -3694,7 +3694,7 @@ XML: - Web.Release.config - Web.config - packages.config - color: "#36BBF3" + color: "#E88E88" XPages: type: programming @@ -3740,7 +3740,7 @@ XSLT: - .xsl tm_scope: text.xml.xsl ace_mode: xml - color: "#1F87CE" + color: "#EB8CEB" Xojo: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#A33890" + color: "#F011F0" Zephir: type: programming @@ -3866,7 +3866,7 @@ reStructuredText: - .rst - .rest ace_mode: text - color: "#444444" + color: "#B3BCBC" wisp: type: programming From 802de8112ccb3e9cd5696efe9dc5a2b8e6f9a3b9 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 14:39:19 +0300 Subject: [PATCH 037/227] Update some colors to fix closeness. --- lib/linguist/languages.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 40ac5b40..2ccff3d2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -153,7 +153,7 @@ Ant Build System: - ant.xml - build.xml ace_mode: xml - color: "#A82C7C" + color: "#C64A9A" ApacheConf: type: markup @@ -183,7 +183,7 @@ AppleScript: interpreters: - osascript ace_mode: applescript - color: "#F2F1F1" + color: "#101F1F" Arc: type: programming @@ -291,7 +291,7 @@ Batchfile: - .cmd tm_scope: source.dosbatch ace_mode: batchfile - color: "#A3D300" + color: "#C1F12E" Befunge: type: programming @@ -631,7 +631,7 @@ Common Lisp: Component Pascal: type: programming - color: "#c1df5f" + color: "#EFFD7D" extensions: - .cp - .cps @@ -694,7 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text - color: "#00A818" + color: "#2EC636" Cuda: type: programming @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#1C201C" + color: "#3A4E3A" Cycript: type: programming @@ -1714,7 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text - color: "#79AEE8" + color: "#97CC06" LOLCODE: type: programming @@ -1778,7 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less - color: "#83BB83" + color: "#A1D9A1" Lex: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#80B729" + color: "#AED547" Mask: type: markup @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#b0ce4e" + color: "#DEEC6C" extensions: - .pas - .dfm @@ -2779,7 +2779,7 @@ QMake: R: type: programming - color: "#2A9DF8" + color: "#198CE7" aliases: - R - Rscript @@ -2809,7 +2809,7 @@ RDoc: extensions: - .rdoc tm_scope: text.rdoc - color: "#333333" + color: "#515151" REALbasic: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#F011F0" + color: "#1E3F1E" Zephir: type: programming From 35884d482cc6b4813d9e6a4787a8cfd21ffea84d Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 15:38:41 +0300 Subject: [PATCH 038/227] Update some colors to fix closeness. --- lib/linguist/languages.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 2ccff3d2..49aa2c75 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -694,7 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text - color: "#2EC636" + color: "#2EF336" Cuda: type: programming @@ -1714,7 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text - color: "#97CC06" + color: "#185619" LOLCODE: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#AED547" + color: "#DB0274" Mask: type: markup @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#DEEC6C" + color: "#0B1999" extensions: - .pas - .dfm @@ -2809,7 +2809,7 @@ RDoc: extensions: - .rdoc tm_scope: text.rdoc - color: "#515151" + color: "#8E84BF" REALbasic: type: programming @@ -3773,7 +3773,7 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml - color: "#001111" + color: "#56789A" Yacc: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#1E3F1E" + color: "#4B6C4B" Zephir: type: programming From ee61466042069db8a649a3e13444c3d079f1a685 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 15:58:46 +0300 Subject: [PATCH 039/227] Update some colors to fix closeness. --- lib/linguist/languages.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 49aa2c75..4094b18e 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -694,7 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text - color: "#2EF336" + color: "#5B2063" Cuda: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#DB0274" + color: "#083FA1" Mask: type: markup @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#0B1999" + color: "#3846C6" extensions: - .pas - .dfm From cf834e8a2176d4dfaaa5e7aaf4c706c6ac756c15 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 16:23:33 +0300 Subject: [PATCH 040/227] Update some colors to fix closeness. --- lib/linguist/languages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 4094b18e..87059633 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -631,7 +631,7 @@ Common Lisp: Component Pascal: type: programming - color: "#EFFD7D" + color: "#B0CE4E" extensions: - .cp - .cps @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#3846C6" + color: "#C1DF5F" extensions: - .pas - .dfm From 7e76d1cc6bafbf3357eaf8025b1836ac8744fd06 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 17:01:38 +0300 Subject: [PATCH 041/227] Update Pascal color to fix the closeness issue. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 87059633..ad9ac132 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#C1DF5F" + color: "#E3F171" extensions: - .pas - .dfm From fc5ae1cfbcad8efa8fce84b4592fadf6b65fbfb2 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 17:53:58 +0300 Subject: [PATCH 042/227] Revert colors of some languages. Revert colors of some languages which have 'type: data' attribute. --- lib/linguist/languages.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index ad9ac132..496fbee3 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -153,7 +153,6 @@ Ant Build System: - ant.xml - build.xml ace_mode: xml - color: "#C64A9A" ApacheConf: type: markup @@ -1210,7 +1209,6 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text - color: "#4B0283" Grammatical Framework: type: programming @@ -2027,7 +2025,6 @@ Maven POM: filenames: - pom.xml ace_mode: xml - color: "#007915" Max: type: programming @@ -3694,7 +3691,6 @@ XML: - Web.Release.config - Web.config - packages.config - color: "#E88E88" XPages: type: programming @@ -3773,7 +3769,6 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml - color: "#56789A" Yacc: type: programming From 4d2b38497dda3ad2258af363e5bf51647c004097 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 18:53:29 +0300 Subject: [PATCH 043/227] Remove color attributes of 'type: data's. --- lib/linguist/languages.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 496fbee3..3d639833 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -795,7 +795,6 @@ Dart: Diff: type: data - color: "#88dddd" extensions: - .diff - .patch @@ -3461,7 +3460,6 @@ Unified Parallel C: Unity3D Asset: type: data ace_mode: yaml - color: "#ab69a1" extensions: - .anim - .asset @@ -3818,7 +3816,6 @@ eC: edn: type: data ace_mode: clojure - color: "#db5855" extensions: - .edn tm_scope: source.clojure From e4ce5bfe39bb7b29d416db16241b33acb5df7e2a Mon Sep 17 00:00:00 2001 From: Scott Nelson Date: Wed, 2 Sep 2015 12:52:25 -0400 Subject: [PATCH 044/227] Ignore spec fixtures --- lib/linguist/vendor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index 12473d85..ddbc6502 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -266,6 +266,7 @@ # Test fixtures - ^[Tt]ests?/fixtures/ +- ^[Ss]pecs?/fixtures/ # PhoneGap/Cordova - (^|/)cordova([^.]*)\.js$ From 580cfce7fbd1d7d3dbb06ab9a7fdea54c6527797 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 3 Sep 2015 14:39:27 +0100 Subject: [PATCH 045/227] Adding support for generated overrides --- lib/linguist/lazy_blob.rb | 30 +++++++++++++++++++++--------- test/test_repository.rb | 10 ++++++++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/linguist/lazy_blob.rb b/lib/linguist/lazy_blob.rb index 78f37b18..55c10309 100644 --- a/lib/linguist/lazy_blob.rb +++ b/lib/linguist/lazy_blob.rb @@ -4,7 +4,11 @@ require 'rugged' module Linguist class LazyBlob - GIT_ATTR = ['linguist-documentation', 'linguist-language', 'linguist-vendored'] + GIT_ATTR = ['linguist-documentation', + 'linguist-language', + 'linguist-vendored', + 'linguist-generated'] + GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true } GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS) @@ -31,14 +35,6 @@ module Linguist name, GIT_ATTR, GIT_ATTR_FLAGS) end - def vendored? - if attr = git_attributes['linguist-vendored'] - return boolean_attribute(attr) - else - return super - end - end - def documentation? if attr = git_attributes['linguist-documentation'] boolean_attribute(attr) @@ -47,6 +43,22 @@ module Linguist end end + def generated? + if attr = git_attributes['linguist-generated'] + boolean_attribute(attr) + else + super + end + end + + def vendored? + if attr = git_attributes['linguist-vendored'] + return boolean_attribute(attr) + else + super + end + end + def language return @language if defined?(@language) diff --git a/test/test_repository.rb b/test/test_repository.rb index fcdd4f0c..a1f9fc86 100644 --- a/test/test_repository.rb +++ b/test/test_repository.rb @@ -111,4 +111,14 @@ class TestRepository < Minitest::Test refute_predicate readme, :documentation? assert_predicate arduino, :documentation? end + + def test_linguist_override_generated? + attr_commit = "351c1cc8fd57340839bdb400d7812332af80e9bd" + repo = linguist_repo(attr_commit).read_index + + rakefile = Linguist::LazyBlob.new(rugged_repository, attr_commit, "Rakefile") + + # overridden .gitattributes + assert rakefile.generated? + end end From 4bfd65deb84c33b2e2deb60b6fadda4460985170 Mon Sep 17 00:00:00 2001 From: Paul Cantrell Date: Wed, 19 Aug 2015 11:42:21 -0500 Subject: [PATCH 046/227] #import "*.h" detection for Objective-C --- lib/linguist/heuristics.rb | 2 +- samples/Objective-C/Siesta.h | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 samples/Objective-C/Siesta.h diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index dd1f8ee6..1660d99f 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -65,7 +65,7 @@ module Linguist end # Common heuristics - ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronized|selector|implementation)\b/ + ObjectiveCRegex = /^\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\b|#import\s+.+\.h[">])/ disambiguate ".asc" do |data| if /^(----[- ]BEGIN|ssh-(rsa|dss)) /.match(data) diff --git a/samples/Objective-C/Siesta.h b/samples/Objective-C/Siesta.h new file mode 100644 index 00000000..a48984e3 --- /dev/null +++ b/samples/Objective-C/Siesta.h @@ -0,0 +1,16 @@ +// +// Siesta.h +// Siesta +// +// Created by Paul on 2015/6/14. +// Copyright © 2015 Bust Out Solutions. MIT license. +// + +#import + +//! Project version number for Siesta. +FOUNDATION_EXPORT double SiestaVersionNumber; + +//! Project version string for Siesta. +FOUNDATION_EXPORT const unsigned char SiestaVersionString[]; + From b1dcdf34186d3088e6e45ed9a78ffe9af26e96b7 Mon Sep 17 00:00:00 2001 From: miksen Date: Fri, 4 Sep 2015 11:49:10 +0200 Subject: [PATCH 047/227] Language bar clarification in README.md Clarified what the percentages in the Language bar are based on. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ca08af1..2a4d3c31 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md ![language stats bar](https://cloud.githubusercontent.com/assets/173/5562290/48e24654-8ddf-11e4-8fe7-735b0ce3a0d3.png) -The Language stats bar is built by aggregating the languages of each file in that repository. If it is reporting a language that you don't expect: +The Language stats bar displays languages percentages for the files in the repository. The percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://developer.github.com/v3/repos/#list-languages) API. If the bar is reporting a language that you don't expect: 0. Click on the name of the language in the stats bar to see a list of the files that are identified as that language. 0. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them. From 1f46cfafa7ddf7e849f73e2472c558004b83f22c Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 5 Sep 2015 13:31:17 +0200 Subject: [PATCH 048/227] New JSX language under JavaScript group A specific grammar is needed to highlight .jsx files Thus, there are now in a distinct language but still in the JavaScript group --- .gitmodules | 3 +++ grammars.yml | 3 +++ lib/linguist/languages.yml | 9 ++++++++- samples/JSX/sample.jsx | 23 +++++++++++++++++++++++ vendor/grammars/language-babel | 1 + 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 samples/JSX/sample.jsx create mode 160000 vendor/grammars/language-babel diff --git a/.gitmodules b/.gitmodules index 5f07d011..87654b7e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -677,3 +677,6 @@ [submodule "vendor/grammars/X10"] path = vendor/grammars/X10 url = git@github.com:x10-lang/x10-highlighting.git +[submodule "vendor/grammars/language-babel"] + path = vendor/grammars/language-babel + url = https://github.com/gandm/language-babel diff --git a/grammars.yml b/grammars.yml index 42be3967..2a7a89e2 100644 --- a/grammars.yml +++ b/grammars.yml @@ -314,6 +314,9 @@ vendor/grammars/json.tmbundle: - source.json vendor/grammars/kotlin-sublime-package: - source.Kotlin +vendor/grammars/language-babel/: +- source.js.jsx +- source.regexp.babel vendor/grammars/language-clojure: - source.clojure vendor/grammars/language-coffee-script: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b2d75fa1..7be29046 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1575,6 +1575,14 @@ JSONiq: - .jq tm_scope: source.jq +JSX: + type: programming + group: JavaScript + extensions: + - .jsx + tm_scope: source.js.jsx + ace_mode: javascript + Jade: group: HTML type: markup @@ -1628,7 +1636,6 @@ JavaScript: - .jsfl - .jsm - .jss - - .jsx - .njs - .pac - .sjs diff --git a/samples/JSX/sample.jsx b/samples/JSX/sample.jsx new file mode 100644 index 00000000..2020618d --- /dev/null +++ b/samples/JSX/sample.jsx @@ -0,0 +1,23 @@ +'use strict'; + +const React = require('react') + +module.exports = React.createClass({ + render: function() { + let {feeds, log} = this.props; + + log.info(feeds); + return

+

News Feed's

+
    + {feeds.map(function(feed) { + return
  • + {feed.data && feed.data.length > 0 ? + {feed.name} ({feed.data.length}) + : 'feed.name' } +
  • + })} +
+
; + } +}); diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel new file mode 160000 index 00000000..c79ac897 --- /dev/null +++ b/vendor/grammars/language-babel @@ -0,0 +1 @@ +Subproject commit c79ac8979cff724e7db8933044f00b975dc4f277 From b275b5d728fd0330f8df29513a8c935528e2bc36 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Fri, 4 Sep 2015 10:24:06 +0200 Subject: [PATCH 049/227] Soften memory pressure --- lib/linguist/generated.rb | 8 ++++++-- lib/linguist/heuristics.rb | 3 ++- lib/linguist/lazy_blob.rb | 4 ++++ lib/linguist/repository.rb | 7 +++++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb index f1fb2d19..d107e737 100644 --- a/lib/linguist/generated.rb +++ b/lib/linguist/generated.rb @@ -241,22 +241,26 @@ module Linguist return lines[0].include?("Code generated by") end + PROTOBUF_EXTENSIONS = ['.py', '.java', '.h', '.cc', '.cpp'] + # Internal: Is the blob a C++, Java or Python source file generated by the # Protocol Buffer compiler? # # Returns true of false. def generated_protocol_buffer? - return false unless ['.py', '.java', '.h', '.cc', '.cpp'].include?(extname) + return false unless PROTOBUF_EXTENSIONS.include?(extname) return false unless lines.count > 1 return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!") end + APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp'] + # Internal: Is the blob generated by Apache Thrift compiler? # # Returns true or false def generated_apache_thrift? - return false unless ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp'].include?(extname) + return false unless APACHE_THRIFT_EXTENSIONS.include?(extname) return false unless lines.count > 1 return lines[0].include?("Autogenerated by Thrift Compiler") || lines[1].include?("Autogenerated by Thrift Compiler") diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 1660d99f..11f58b28 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -56,7 +56,8 @@ module Linguist # Internal: Check if this heuristic matches the candidate languages. def matches?(filename) - @extensions.any? { |ext| filename.downcase.end_with?(ext) } + filename = filename.downcase + @extensions.any? { |ext| filename.end_with?(ext) } end # Internal: Perform the heuristic diff --git a/lib/linguist/lazy_blob.rb b/lib/linguist/lazy_blob.rb index 55c10309..28fb78f3 100644 --- a/lib/linguist/lazy_blob.rb +++ b/lib/linguist/lazy_blob.rb @@ -79,6 +79,10 @@ module Linguist @size end + def cleanup! + @data.clear if @data + end + protected # Returns true if the attribute is present and not the string "false". diff --git a/lib/linguist/repository.rb b/lib/linguist/repository.rb index 181ddf0e..01e595da 100644 --- a/lib/linguist/repository.rb +++ b/lib/linguist/repository.rb @@ -157,8 +157,11 @@ module Linguist blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8)) - next unless blob.include_in_language_stats? - file_map[new] = [blob.language.group.name, blob.size] + if blob.include_in_language_stats? + file_map[new] = [blob.language.group.name, blob.size] + end + + blob.cleanup! end end From b1bcabd6e6896b00dc06f6be9ef482729d645807 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 8 Sep 2015 12:25:05 +0100 Subject: [PATCH 050/227] Adding Handlebars to the HTML group --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 7be29046..8409337b 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1367,6 +1367,7 @@ Haml: Handlebars: type: markup color: "#01a9d6" + group: HTML aliases: - hbs - htmlbars From 13d1f662d1ec2bf1ce3af6eef2459f520f9701fe Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Fri, 4 Sep 2015 15:11:29 +0200 Subject: [PATCH 051/227] Add the `git-linguist` helper --- bin/git-linguist | 141 ++++++++++++++++++++++++++++++++++++++++ github-linguist.gemspec | 2 +- lib/linguist/version.rb | 2 +- 3 files changed, 143 insertions(+), 2 deletions(-) create mode 100755 bin/git-linguist diff --git a/bin/git-linguist b/bin/git-linguist new file mode 100755 index 00000000..f761cfaf --- /dev/null +++ b/bin/git-linguist @@ -0,0 +1,141 @@ +#!/usr/bin/env ruby + +require 'linguist' +require 'rugged' +require 'optparse' +require 'json' +require 'tmpdir' +require 'zlib' + +class GitLinguist + attr_reader :repo_path + attr_reader :commit_oid + attr_reader :incremental + + def initialize(path, commit_oid, incremental = true) + @repo_path = path + @commit_oid = commit_oid || rugged.head.target_id + @incremental = incremental + end + + def linguist + repo = Linguist::Repository.new(rugged, commit_oid) + + if incremental && stats = load_language_stats + old_commit_oid, old_stats = stats + + # A cache with NULL oid means that we want to froze + # these language stats in place and stop computing + # them (for performance reasons) + return old_stats if old_commit_oid == NULL_OID + repo.load_existing_stats(old_commit_oid, old_stats) + end + + result = yield repo + + save_language_stats(commit_oid, repo.cache) + result + end + + def load_language_stats + version, commit_oid, stats = load_cache + if version == LANGUAGE_STATS_CACHE_VERSION && commit_oid && stats + [commit_oid, stats] + end + end + + def save_language_stats(commit_oid, stats) + cache = [LANGUAGE_STATS_CACHE_VERSION, commit_oid, stats] + write_cache(cache) + end + + def clear_language_stats + File.unlink(cache_file) + end + + def disable_language_stats + save_language_stats(NULL_OID, {}) + end + + protected + NULL_OID = ("0" * 40).freeze + + LANGUAGE_STATS_CACHE = 'language-stats.cache' + LANGUAGE_STATS_CACHE_VERSION = "v3:#{Linguist::VERSION}" + + def rugged + @rugged ||= Rugged::Repository.bare(repo_path) + end + + def cache_file + File.join(repo_path, LANGUAGE_STATS_CACHE) + end + + def write_cache(object) + tmp_path = Dir::Tmpname.make_tmpname(cache_file, nil) + + File.open(tmp_path, "wb") do |f| + marshal = Marshal.dump(object) + f.write(Zlib::Deflate.deflate(marshal)) + end + + File.rename(tmp_path, cache_file) + tmp_path = nil + ensure + (File.unlink(tmp_path) rescue nil) if tmp_path + end + + def load_cache + marshal = File.open(cache_file, "rb") { |f| Zlib::Inflate.inflate(f.read) } + Marshal.load(marshal) + rescue SystemCallError, ::Zlib::DataError, ::Zlib::BufError, TypeError + nil + end +end + + +def git_linguist(args) + incremental = true + commit = nil + git_dir = nil + + parser = OptionParser.new do |opts| + opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable" + + opts.on("-f", "--force", "Force a full rescan") { incremental = false } + opts.on("--git-dir=DIR", "Path to the git repository") { |v| git_dir = v } + opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v} + end + + parser.parse!(args) + + git_dir ||= begin + pwd = Dir.pwd + dotgit = File.join(pwd, ".git") + File.directory?(dotgit) ? dotgit : pwd + end + + wrapper = GitLinguist.new(git_dir, commit, incremental) + + case args.pop + when "stats" + wrapper.linguist do |linguist| + puts JSON.dump(linguist.languages) + end + when "breakdown" + wrapper.linguist do |linguist| + puts JSON.dump(linguist.breakdown_by_file) + end + when "dump-cache" + puts JSON.dump(wrapper.load_language_stats) + when "clear" + wrapper.clear_language_stats + when "disable" + wrapper.disable_language_stats + else + $stderr.print(parser.help) + exit 1 + end +end + +git_linguist(ARGV) diff --git a/github-linguist.gemspec b/github-linguist.gemspec index 87bbc8bf..8e043857 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |s| s.license = "MIT" s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] - s.executables << 'linguist' + s.executables = ['linguist', 'git-linguist'] s.add_dependency 'charlock_holmes', '~> 0.7.3' s.add_dependency 'escape_utils', '~> 1.1.0' diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index dbdb7d7f..0ee8b185 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.5.15" + VERSION = "4.6.0.rc3" end From c2c068e9db1fdb900716dcc9373e37ff5d2a4ca2 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Mon, 14 Sep 2015 08:43:10 -0700 Subject: [PATCH 052/227] Bump version to 4.6.0 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 0ee8b185..a90a01fa 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.6.0.rc3" + VERSION = "4.6.0" end From 0145a0adb2633d99255c01239fab90fe93dd13d2 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Wed, 16 Sep 2015 05:40:55 -0700 Subject: [PATCH 053/227] git-linguist: Delay loading @commit_oid --- bin/git-linguist | 29 ++++++++++++++--------------- lib/linguist/version.rb | 2 +- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/bin/git-linguist b/bin/git-linguist index f761cfaf..03408ee5 100755 --- a/bin/git-linguist +++ b/bin/git-linguist @@ -8,20 +8,19 @@ require 'tmpdir' require 'zlib' class GitLinguist - attr_reader :repo_path - attr_reader :commit_oid - attr_reader :incremental - def initialize(path, commit_oid, incremental = true) @repo_path = path - @commit_oid = commit_oid || rugged.head.target_id + @commit_oid = commit_oid @incremental = incremental end def linguist - repo = Linguist::Repository.new(rugged, commit_oid) + if @commit_oid.nil? + raise "git-linguist must be called with a specific commit OID to perform language computation" + end + repo = Linguist::Repository.new(rugged, @commit_oid) - if incremental && stats = load_language_stats + if @incremental && stats = load_language_stats old_commit_oid, old_stats = stats # A cache with NULL oid means that we want to froze @@ -33,19 +32,19 @@ class GitLinguist result = yield repo - save_language_stats(commit_oid, repo.cache) + save_language_stats(@commit_oid, repo.cache) result end def load_language_stats - version, commit_oid, stats = load_cache - if version == LANGUAGE_STATS_CACHE_VERSION && commit_oid && stats - [commit_oid, stats] + version, oid, stats = load_cache + if version == LANGUAGE_STATS_CACHE_VERSION && oid && stats + [oid, stats] end end - def save_language_stats(commit_oid, stats) - cache = [LANGUAGE_STATS_CACHE_VERSION, commit_oid, stats] + def save_language_stats(oid, stats) + cache = [LANGUAGE_STATS_CACHE_VERSION, oid, stats] write_cache(cache) end @@ -64,11 +63,11 @@ class GitLinguist LANGUAGE_STATS_CACHE_VERSION = "v3:#{Linguist::VERSION}" def rugged - @rugged ||= Rugged::Repository.bare(repo_path) + @rugged ||= Rugged::Repository.bare(@repo_path) end def cache_file - File.join(repo_path, LANGUAGE_STATS_CACHE) + File.join(@repo_path, LANGUAGE_STATS_CACHE) end def write_cache(object) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index a90a01fa..7f5e1750 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.6.0" + VERSION = "4.6.1" end From b54a9c7412d7659f0920a8bc5f9e8447be87b50e Mon Sep 17 00:00:00 2001 From: wizawu Date: Mon, 21 Sep 2015 13:48:30 +0800 Subject: [PATCH 054/227] Add new extension .tsx for TypeScript TypeScript 1.6 has introduced a new .tsx file extension. --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8409337b..ddb18e78 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3441,6 +3441,7 @@ TypeScript: - ts extensions: - .ts + - .tsx tm_scope: source.ts ace_mode: typescript From 6a2d33a4b345039661ff37167bbdceaaf8875306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Mon, 21 Sep 2015 19:04:30 +0200 Subject: [PATCH 055/227] Bump language-javascript for syntax highlighting fix This is primarily to pull https://github.com/atom/language-javascript/pull/227 Full changelog: https://github.com/atom/language-javascript/compare/c5c381e...7b14bbb#diff-46d5c1ca71eaebb92619d6c7abc9388d --- vendor/grammars/language-javascript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index c5c381e3..7b14bbb0 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit c5c381e37812219db84cb5916094ca3b8dce62db +Subproject commit 7b14bbb041abcb39522defceca509cd35b6a7449 From 090ea576b956bc812498f99da2604e95b2e3ee70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Mon, 21 Sep 2015 21:23:40 +0200 Subject: [PATCH 056/227] github-linguist-grammars 4.6.2 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 7f5e1750..60bc59e0 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.6.1" + VERSION = "4.6.2" end From a354eddf4bce62acbc5f4b140dd64da71750a751 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Tue, 22 Sep 2015 16:33:08 -0400 Subject: [PATCH 057/227] Update github-linguist.gemspec --- github-linguist.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github-linguist.gemspec b/github-linguist.gemspec index 8e043857..bdba3e6b 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -10,7 +10,7 @@ Gem::Specification.new do |s| s.homepage = "https://github.com/github/linguist" s.license = "MIT" - s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + ['LICENSE'] s.executables = ['linguist', 'git-linguist'] s.add_dependency 'charlock_holmes', '~> 0.7.3' From c624d686283df346ab8b24efdb2a81c98aaf16cf Mon Sep 17 00:00:00 2001 From: Jared Petersen Date: Wed, 23 Sep 2015 20:29:07 -0700 Subject: [PATCH 058/227] Added .pck PLSQL file extension --- lib/linguist/languages.yml | 1 + samples/PLSQL/plsqlguide.pck | 90 ++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 samples/PLSQL/plsqlguide.pck diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8409337b..abac6618 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2456,6 +2456,7 @@ PLSQL: color: "#dad8d8" extensions: - .pls + - .pck - .pkb - .pks - .plb diff --git a/samples/PLSQL/plsqlguide.pck b/samples/PLSQL/plsqlguide.pck new file mode 100644 index 00000000..d31830ba --- /dev/null +++ b/samples/PLSQL/plsqlguide.pck @@ -0,0 +1,90 @@ +create or replace package plsqlguide is + +-- Author : Jared Petersen +-- Created : 9/22/2015 12:26:22 AM +-- Purpose : Basic PLSQL template/guide + +/* Procedures */ +procedure p_main; + +end plsqlguide; +/ +create or replace package body plsqlguide is + +/* Main entry point (homepage) */ +procedure p_main + is +begin + +htp.prn(' + + + + + + + + PL/SQL Sample Application + + + + + + + + + + + +
+ + + + + + + + +'); + +-- Fill out the parts table +for row in (select * from parts) loop + htp.prn(' + + + + + + + + '); +end loop; + +htp.prn(' +
#NameDescriptionQuantityPrice
'||row.pid||''||row.name||''||row.description||''||row.quantity||''||row.price||'
+
+ + + + + + + +'); + +end p_main; + +begin + -- Initialization + null; +end plsqlguide; +/ From 01bb6c37abe56263225a4bcd533dbbd8d82710f7 Mon Sep 17 00:00:00 2001 From: Ingo Blechschmidt Date: Fri, 25 Sep 2015 18:48:01 +0200 Subject: [PATCH 059/227] Detect Pickle data dumps (.p, .pkl, .pickle) --- lib/linguist/languages.yml | 9 +++ samples/Pickle/data.p | 24 ++++++++ .../neural-network-ce-l2reg-784-10-30.p | 60 +++++++++++++++++++ samples/Pickle/random.p | 36 +++++++++++ samples/Pickle/save.p | 10 ++++ 5 files changed, 139 insertions(+) create mode 100644 samples/Pickle/data.p create mode 100644 samples/Pickle/neural-network-ce-l2reg-784-10-30.p create mode 100644 samples/Pickle/random.p create mode 100644 samples/Pickle/save.p diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8409337b..45c7e4c8 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2572,6 +2572,15 @@ Perl6: tm_scope: source.perl.6 ace_mode: perl +Pickle: + type: data + extensions: + - .p + - .pickle + - .pkl + tm_scope: none + ace_mode: text + PicoLisp: type: programming extensions: diff --git a/samples/Pickle/data.p b/samples/Pickle/data.p new file mode 100644 index 00000000..cf451f4f --- /dev/null +++ b/samples/Pickle/data.p @@ -0,0 +1,24 @@ +(dp0 +S'a' +p1 +(lp2 +I1 +aF2.0 +aI3 +ac__builtin__ +complex +p3 +(F4.0 +F6.0 +tp4 +Rp5 +asS'c' +p6 +NsS'b' +p7 +(S'string' +p8 +VUnicode string +p9 +tp10 +s. \ No newline at end of file diff --git a/samples/Pickle/neural-network-ce-l2reg-784-10-30.p b/samples/Pickle/neural-network-ce-l2reg-784-10-30.p new file mode 100644 index 00000000..2ad7bad3 --- /dev/null +++ b/samples/Pickle/neural-network-ce-l2reg-784-10-30.p @@ -0,0 +1,60 @@ +(cnumpy.core.multiarray +_reconstruct +p1 +(cnumpy +ndarray +p2 +(I0 +tS'b' +tRp3 +(I1 +(I10 +I784 +tcnumpy +dtype +p4 +(S'f8' +I0 +I1 +tRp5 +(I3 +S'<' +NNNI-1 +I-1 +I0 +tbI00 +S'B\xf9\xc2tq0\xed?\xe7\xcd\xa1\x01\xe7\xb9\xca\xbf\x19X;&x8\xea?\xa9V\xc7\xf2\x81\xd3\xd8\xbf\xaa\xa8fs\x88\xaa\xe6?\x1bC\xde\xe8,!\xf0?\xf3\x10%y\x89\x83\xe9\xbf\xc5\x9dY\t{\x94\xf4\xbf:/\x18\x10l\xd7\xe2?[g\x8f\xa8O\x99\xc9\xbf\xeb\x11g\x06\xe9\xd2\xe0\xbf\xd7\xe6R\x0b\xd5\x19\xe8\xbfF\x90\xef\xfe\x05>\xd9\xbf_\x82u\x8d\xa2\xd3\xae\xbf/\x91\x97\x8b>I\xca?f\x9a\xb7\x15O!\xd0\xbf|\xff\xfe\x98#\x1f\xd2\xbf\x98J@kO\xa6\xe4\xbf\x90\x94@ \x82\xbf\xd9?=2\x1f\xc7\xcbi\xf1?\xbc\x07\x9cJj\x96\xed\xbf\xc0\xf2c\x8f\xb4\xc3\xca\xbf\xb8):\x0f\x8e\x00\xe1?\xc6\xfe\xae\n\xc0M\xce?\xf0hf:]#\xd1?\xd6f9_\xf0\t\xe4?\xbd1\x8b\xf3T7\xf3?\xcfCX\xbfQ\xf5\xec\xbf\xaaP^\xaf\x00\xe0\x8e\xbf\xa4\x122FP!\xd4?\xcf\xa5>\xa6\xee\xc0\xd9\xbf\xeb\xae\x90\xd2*\x05\xdf?\xb2nPzh\xa0\xf3?d\xf8\xa8P\xf9d\xb6?\x1e\x8b\x1b\xfe\x9e\xf2\xc6?\xb8\x92.\x1c\\1\xd3?`hs\xc7;T\xd2?MQ\x99+\xfc\x9c\xf0?;\\F\xf40=\xb9?Y\xbc\xd4\xb5\xf9\xe6\xa5\xbf?\x02\xf4\xa6\xc6\x9d\xe5\xbf\xe0\x94\xf0\xef#\x7f\xd2\xbf\xf2\xd7\\I\x8eh\xc8?\xf1\xd9S\xf1-\xef\xda\xbf\x1e\xe9\xbeZ\xbav\xff?n\xb7erb\xdf\xbe\xbf\xc8\xa9d\xe9\xb1\x81\xf1\xbf\x0f\x81\xa5E{\xfc\xd1?*\x8d\xb8s\x05T\xef\xbf\xf3.s\xf0\x1e\xe8\xdd?\xcab\x0cT\x1bZ\xe9?\xc4\xf3\rQ\xdd\x10\xd8\xbf\x1eHe\xc2\xca\xca\xda?\xbdq\xe9p\x96{\xdf\xbfD\x05\x0eI\xe6V\xc9\xbf\xcf\xf5\\v\xce8\xea\xbfbV\xd5;\xb5k\xf2\xbf}\x90\x1b|\xd4g\xe0?\xce\xac\xc0\xa9\xe0\x9d\x90?+\xf3W(\x01u\xdb\xbf\xac\xa19"D\x7f\xdd?\x1d\xf2\xfbmJ\xb8\xdd?fv\x8c\x0bt\x18\xf0\xbf\xff\x94hIJ&\xe8?\x87\xf4\xb3K\xdbC\xdc\xbf\x1a9G\xc1p\xa0\xc2\xbf%^ZX\xaa\xbd\xda\xbf4\xdf\x9f\xac\x10!\xe2\xbf\xc8:$\x03\xb3\xce\xc4\xbf\xa7,\x11\xf4\xf9\x14\xe5\xbf\x97\xb2\x8ez\xe4w\xdc?T0\xedSI\xdf\xd5?\xc5\xd8W0^\xce\xc4?\xee`\x867\xdb\xb4\xe7\xbf\xc1F\xf1\x00B\x10\x03\xc0\xf1\xcd\xdeM\xb7P\xf1\xbf\x07\xb7\x80KIn\xf6\xbf\xeb2\xc3O\x95\x9b\xb7\xbf\xa7s^\xa5x\x05\xe2?^\xd3\x1b\xbbA?\xf4\xbf\xfc+U\xb0M\xa8\xd5?\x1d gm$\xf4\xda?\xa7"c\xaf\xbf\x04\xe1\xbf\xb6U7\xde3v\xb9\xbf\x81"\x95\xe7G\x14\xc4?!^S,\xb60\x01\xc0i\x08&\xf3\x8d\r\xd0\xbf2\x05^w\xe7\xdf\xb7?w\x84}n\xd6\xcd\xe1?\xb3\x98\xfbN\xfb\xa2\xee?S\xab/\xef\x7f\x12\xf3\xbfWw\xf4\xfez\xae\xeb?a\xa5~\x19&\xec\xf3?\xb1\x08\xfe\xdd-\'\xd3\xbf\xbe\xe5i\r\xca\x90\xe9?\xf0\'T\xe3\xd1j\xe3?uH\xe3\xea8\xcb\xc0?X\xaf\x86\xa6\xe3\xb7\xf4?\xb7\xcc\xael6\x7f\xda\xbf\x06\x87a\xe2\x0e\xf0\xb4\xbfnWl6\x1b\x9e\xe9?\x97\xfb\x91X2\xf6\xb0\xbfT[\xea\xc0\xdfr\xe0?\xba\xd5\x00U\xc5B\xe3?n\xa4V\xa8\xa4z\xd0?\xf4#/,!\x92\xf2\xbf\x82\x83\xae\r\xa6\xec\xea\xbf\xa7t\xbbi\xdb\xf5\xb2\xbf\xd4Wr\xc2\xb0\x93\xcc?\xe2\x03gt\x0cr\xf0\xbfJ\x03\xf6_\xe4\r\xdf?\x8a\x83u#\xfe\x85\xe4\xbf/lf\xbe\xf3\xde\x94?\xbd\x99#\x10\x0c\x90\xf7?\xfd\x832\xfa([\xe5?R\xd9\xa6\xbf-$\x19\xfa7W\xd8?\xe6\xc8\xc6\x8d\x19u\xe4\xbf*\xedf\xd1\xab\x82\xe2\xbf\\7<\x97\x84\x84\xcf?\xc8\xce\xdc\xfb\x1f\xca\xee?\x98\xcbC\xb7\xf2\xac\xe6??\tKt\xbc\x8f\xf9\xbft\x98\x15\xc2\x84\xac\xfa\xbf\x93\'\xc6\xe6\xc5\xc3\xf7\xbfv\x9eLu\xdbq\xf6?H\x85\xf5e\xf0\x85\x8b\xbf>\xd9\xfas\x15%\xf2\xbf\xe4\xcf\x9e\xad\xf6\x96\xf4?_(\xfa\x94o\xbc\xe6?\n\xb0\x0cC!\x8e\xfd?1\x04lY])\x01@4_\x1bdyP\xe6?\xf8\xf1CG\xfe\x91\xe0\xbfD\x8c,\xdb\xcf\x14\xc2?\xe9N\xf1\x926\n\xdb?\x01\xed,\xba\x1dp\xe1\xbf\x87\xed\xd2\xcb\xe6\xc5\xde?(\xca\x9f\x02\xb7\xba\xcb\xbf\x179\xf7\x9c\xca\xa1\xe5?\x1d\x93P\xdbV\x1f\xf0?\xe0\xd2\xb41;\xf1\xfa\xbf+\x81M9\x88\xa0\xf5?\x9b\x01\xdb\x14g\x85\xc4\xbf\x82\\\xd7\xad-\xc6\xee\xbf\x85\xc9\xa2i\x95\x03\xe1\xbf\x04\xa0\xcb\xc1\xc7{\xde\xbf\x84()\xa4\xd8\xe9\xf3\xbf\x97NY\x85\xa3\x8e\xe0?\x0f\xf5\xaa\x1c\x1a\xe8\x00@4\xf9+\xce\xab\xdc\xf6\xbf\xf1\x98D\xa6\x07\xe3\xe1\xbfT\xa3A\xa7\x95\x17\x01@\xc8iPOe\xc2\xfc?\xdb(l\xd7o\xd3\xff\xbf}\xd1\x17\xee \x00\x02@\x95\xe0\x93X&\'\xcf\xbfgF\xd9(\x9f\x02\xe0?p\x9a\x9a\xc2\x12\x8c\xf9?\x9c\x7f\xed\x93\x11R\x00@\xcby\xd3\x94\xc7\x91\xea\xbf)\xea\x93\xfa\xc1+\xf2?\xe0\xd5\xd7\xd2\x99\xe7\xe2\xbf\x0b\xdf=`T\xbf\xca\xbf\x84\xed\x92\xef\x8d\x0b\xd9?\xc7\xa9XI\xfeH\xeb\xbf\xebJ#\xbd\xa3`\xf0?\xc5\x82\xb8\xf7\x12\xb4\x01\xc0\x0c\xaa\xdb\xe5\xe6\xff\xf5\xbfx\xceQ\x11]\xee\x01\xc0\xba*\n/\xa7\x15\xc7\xbf\x89\x1bC\x8e\xe7\xc9\xec\xbf\x1e\xcb\xeb\xc3\xcdb\xe6\xbf\xcf\x9c\x1f\x0e\x04\xe0\xf0\xbfvV\x05>\x8c\x12\xd8?\x08b\xc9S\xd5\xd3\xff?\x80S\xe4\xddP\xed\xfc\xbf\x99\xa0W\xf7O\xa3\xce\xbfj\xe2\xde\xb2\x1c\x1f\xf4?\x13\x00p\xb7\xe72\xa9?\xdf\xaal\xcfo1\x06\xc0\x024}C\xdd?;Cr\xff\xd8\x11\xe6?\x10\x02k\x80U/\xf9?\x14\xc8_~1\xf1\xa3?0\xa0\xb76\x05\xa0\xe5\xbf@\xf8F\xfa\xe1\x84\xb0\xbf\xa4\x04\xadTx\x80\xc2\xbfP\x82F\xc0\x1eW\xde\xbf\xc8\xbd2K\x1e\xd6\xd4\xbf^X\x81\x0f\x99#\xf8\xbf\x07]}\x11\xff\x95\xd0?;\xafZ\x0e\xc8\xb6\xd5?*I\x9d\xb0\x9fU\xcd?ct}\x1f\r1\xef?\x08\xaa\xc1\xbdQB\xfa\xbf\xf7\x10\xce\xe4\xc7-\xe9\xbf\xfb\xack`w\xd2\x0c\xc0c\xf4<\x13\x8a\xf8\xce?]\x0ei\xe2Fu\xca\xbft\xadq\xe0\xa7\x04\xe9\xbf\x06|\xb1\x0b\x8a}\xe4?\x0e\xefe86M\x05\xc0\xa9n\x87\x1d\xc0U\xe2?\xc0\xc1\xc4x\x95\xb4\xbd\xbfR\xfc\xf4\x0b\xb4Q\xd5?\xfc#\x86\x0c\x8d \xf1\xbf\x1c75\xe1C\x8a\xf0?\xca\x9e\xa2\xd2\xd7\xa4\x04@\x9fP\xd1S\x12\xa9\x10@\xaaw\x94\x97\x95\x18\x00@\x9a\xb7Fz\xbcZ\xf0?g\xa9\x95\xb0=|\x93?s\x13\x9f\xf0}1\xa5?\xac\x8c\x95\x95\xd0w\xff\xbfJ$Sk;\x00\xec\xbf\xd4\xc5\x0e\xb6\xbb\xe4\xf1\xbf\xa8E\xf3\xbe7\xcc\x04@\x92+\xf2\xc2s\t\xe8\xbfN\x12\xf9\xcf\x91\x0e\xba\xbf\xda\xe0\x06\xcc\xd5\x1f\xc1?\x88\x027\x94\xa6\xd5\xd4\xbf\xe6\x95\x0cs\xf5O\x0b\xc0M\xad\x11<\x04r\xd0?\x8ac\xb8\x05\xa18\xf2?_>\xf7w\x843\xd0?\x03\x08a7\xd4\\\xfd\xbf\x8d\xd3\xaf]\xe5\x9c\xb0\xbfqZ\xb6AK/\xa7?)\x8f\xf9z\x8a\x96\xc9?\xeaE\x8er\x8d>\xf9?\xf8w\xed\xde\r\xed\xe9\xbf8\xf5\xbbD\x0e\xdd\xe1\xbf4\x82\x0c:\x0e]\xe5?\xa8\xc4\xad\xa0e\xbe\x06@\xbf>\xc6(\x81\x00\xed\xbf\xc7\x921\xc1*\xb0\x06@\xb2\xb6k\xc7\xfe\xe7\x15@\xdf\xa7\xb9\xc7\x03~\x0b@\xceP\x1f\';A\xf7?\xbe\x8eAL<\xfd\xf3\xbf\xf5\xd7\x87\xbf\x15\x13\x9e?+\xcc\xb4\xce\xfd\xad\xb2?b\xe5\x1e\x88o\xe3\xef\xbfim9aR\xc4\xf3\xbf6\xaakxf\x80\x93?\xb9\xa8\xfd\xa2\xe6~\xf5?g\xae\x19=yW\xfe\xbf\xbe"m\xe3\x85<\n\xc09\xdf]\xb7\x83\xa1\xda?\n\xb1\x89\x90\x9e\x97\r\xc0\x96\xad\x05\xc4@7\xc6\xbf\xee\xa6\xf6~\x95/\x10\xc0<\xb2\xd6\xfd\xa2\x86\xd3\xbf\x940\xfe\x93\xd51\x03@FS\xb9;"\xa7\xd3?9\x1f\r\xaa<\xb9\x0c\xc0z\xc4\rq\xc4\x1f\x03\xc0\xa6\x8e\x15_\xd0\xeb\x06\xc0\xf3\x0eX\xfc\xdd\xd4\x05\xc0\n\xf7J\xa6L&\xea\xbf\xa6\x87\x96\x18\xe4p\t\xc0\xd7\xdbPz\x1aN\xfc\xbf\xf7.-\xef\x95\xdd\xec?\x03\xfa\t4xh\x10@c\xc7s\xb4\xd5\xe8\x10@]\xe7!?\xb0\xec\xee?b\x8e\xb2A0\xf6\x01@K\xb7\xf811\x07\xdc\xbfi\xfaE\xf7\xa8\x16\xfc?\xeav\x84gWW\xf7\xbf\xc1\x99x\x8f\xbf\x1f\xd7\xbf\xfa\x98\x9e\xed\xac\xaf\xc0?C\x90\xd7\xb2\x13\x96\x0f\xc0\xba\r\xbfT\x07\xc4\x98?#\x80\x19\xf8y\xc8\x05\xc0v\xf0s\x97c\xca\x02\xc0\x99\x89A\x85\xfd\xce\xc4\xbf\xa6\xbeV{y\xd5\xde\xbfq45\x8d\xffu\x02\xc0N\x0f\xddt\xeb\xdc\xff\xbf\x0f\xad,b\x96.\xdb\xbff\xcf\xcf\xe5\r5\x07@\x06Q=qm\xcc\n@\x84\xdf\xbe{\t1\xf2\xbf\xc4\x8a:\xae:\x1d\n\xc0\xb0T\x1e~\x844\xf7\xbf\xc1m\xc2\xbe\xc0Z\xff\xbft\x1b\xea\nFT\xe5\xbfz\xed\'\xce\xbdA\xe8\xbf\xd5\xfc\xe2\xd1$\x98\xf2\xbfrI2\xa3\xca\x0c\x01\xc0J6~\x8548\xfd?\x8eH|\xf7\xcbL\x10@\xfc\x02e4x)\x01@\x80\xeb\xdf\x14\xfa\x95\xe9?\xce9\xce\x8f0*\xe5?\xaba\xb6;Y[\xed\xbf8\x89\xe12\xc7\xb0\xd4\xbfc\xfc\xa8eE\xc4\xf1?P\xba\x1f>z\xbd\xb2\xbf\xa7\xfb\x05\x13\xd3\xe7\x11\xc05a\x87\xc4\xea\x88\x0b\xc0g\xc3)\xd6M\xf2\xf9\xbf\xec\x18a\x10^w\x02\xc0\x0b\xa4\x12\xd8\x92\xf5\xea?\x97\xe1\'\'\x99\xa7\xe4?\x02c\xcd~\x1f\x11\x00\xc0a\x82\x85Q^\x97\x01@\x8d\x97|\xfdz\x03\x07@&\xeedI\xcb\xd5\xfe?\x07\x17\x1e\xb7\xed6\xdb\xbfv\xa4\xa5y\xc0\xe2\xf6\xbf\x0f\xb2:\xeb\x1f\xd3\xd7\xbf\xa2\x14M$}\xb6\t\xc0\xdf;g\xd8\xa2~\xed?#r\xdcR\x94\xfb\xf6\xbfc\x1f\x82\x17\x0e\xdc\xf9\xbf\x80\xe7\x08\xe26\x15\x0b\xc0M\x91\x1e\xd3\x99\x98\xf2?\x9fn\x81\xd7b\xb5\r@X\x93\xeb<2\x85\x03@\xc9r\xea\x00\xce\xb7\xf2?\x8c\xc4It\xb5\x8f\xb2\xbf\x0e\xe6\xf5\x81\xbc\xed\xce?\xac\xf0r\x0b\xa8\x8e\xf5?7E\x19\xaa\x115\xee\xbf\x9a~j\x97\x95)\xf1\xbf\x8de\x11\x9d\xad\x8e\xcf\xbfU\x18\x87\x9e\xd5\x9d\x05\xc0\x96\xb0\xde\x17\xab\x8f\xc4?\x19i\x1f.\x07$\xf0?\xa6Kv\xbdFh\xe4\xbf\xc4V\x99cCh\xf6\xbfiT\xfaXw\x8c\xc5\xbf\x8f$\x84\x8d\xcf\xea\xea?\xe7\x8e\x13\xf0\x936\xf9\xbfcn>\xd9\xaf\xfb\x00@r\xe8\xe1\xd3\xdbu\xf1?\xab\x82\xef\xd2\xfb;\xf6\xbfJ\xd2\xc3j\x7f\xbb\xf5\xbf\x07\x04\xb0C\xfb\xb7\x00\xc0\x0c\x82\x0e\xcc\xd8\xf9\xe8\xbf<\xfbh\xb5wJ\x0f\xc0h^\x83\x93\xc5\xe5\x11\xc0\xa1\x95\xfe\rqi\xfe\xbf\x03\xcb\xbd\xb4\xf0)\xf4\xbf\xc5\x17q\x89\x0cd\x08\xc0\xaa>_=\x05\x9f\xfc?\x99\xb9W\x89\xc2\xee\xf2?Qt\'C\xdb\x0e\xf5?\xbe\xac\x9f\xc4\x1c\xad\xe7\xbfd\xac\xa4.\xc9\xac\xe3\xbf\x15W>m\xd0\x0c\x99\xbfv\xf6./\x82y\xd0?(o+L\x17O\xd6\xbf\xec\xfd\xd1P\xb9A\xe4?QAY$v\xf3\xf2\xbf\x90<\xc4\nG=\xe9?\x04\xa7eI\x14\xd4\xcf\xbf\x033\xf4\xfbB\xad\xe1?\x03^$d\xa1\x9f\xc4\xbf\xed\x1c\xdb&\xd1q\xf9?\xab\x1b\xce\x8a\xcc\x05\xf0?A\x060\x87&\xa7\x08\xc0U\x08\x14\x0ci=\x0c@\x88\xde\x8e:[_\xfd?\x1d\xe4Ju\xe5?\xef?\xa0E(|z\xec4\xfd\xbf\xb9\xe0\xe37\xa2=\xd2\xbfh\x9c\xc0\xf3\xfa\x9b\xfb\xbf\xeb\x0c\xddR\x8e\r\xfc\xbf\xb0u\xf1>\xb9\'\x10\xc0\xc9I\x14\x935\xe0\xe5?\xe7\xcb\xcc\x86\x86+\r@\xcf]\xe6\xa1\xa2\xa4\xef?\xfc\x8c\x82\xd9\xc2\x9c\xd1?V\xacJ\xef\x13\x05\xec?\xf0\x08G\'e]\xe4\xbf\xda\x165\xf88]\xd1?\x8crAl\xec\xba\xf1\xbfW\x1c\x07G\x12\xb4\xfa?\x88\x108^\xd5\xcb\r@Y\xc6\x00\xad\xc8&\xf2?\xc0a\xd5\xefs\xaf\xc6\xbf\xef\xeb\x98\x85\x19\x04\x02\xc0b\xd9d\xb4i\xaa\xe7\xbfI\xa0\x96\xbf\x8f\x93\xb8?\x0c~$\xd8\xc0\x94\xf4\xbf\xa0]:\x1b\xf0\x1d\xf0?X\xf4G\x8a}\xfa\x03@:\xdd*\x0b_A\xea?\xda\x1a\xe1*|\x85\x00\xc0\x02\x10j\x14\x88\x10\x07\xc0\xa5\x84\xd1"<\xbd\xf3\xbf\xf0e\xf3\x85\x10c\xfd\xbfM\xdd+8\xff\xad\xf7\xbfb\x00\x1f\xbe\x0c\xef\xf9\xbf\xd6\xa2\x8d\xb9\x86\x83\xfe\xbf-\xe0\x1cuo\xee\xbe\xbf+[\xc7jL\x0b\xf4?\x89M#c\x1b7\xc6?\xd4\\\xdd\x836\xe5\x01@\xab\xeb\xfeB\x16V\xe9?\xe8\xfe\x95)=C\xf3?\x1f\xfb\xc3\xf4t\xba\xbd\xbf\x84\x10a\x13\xba/\xb4\xbf\xe4r\xb5l\x08\xd8\xa4?\x0cT\xa4\x07\xcaJ\xda\xbf\xd8\xa8|Q\xbd\x1d\x06@/\xcb4y\x82Q\x03@\xe8\xb8\xad6\xc7\xa7\x08@\xc9\x01\\\xc6\x1dn\x00@\xd2\x1f\xa3\xc1e\x81\xf1\xbf\xaa\x1e\x1cY\x9c\x91\xeb\xbf\xff\xd2w\xba\xbe(\xd8\xbfs\x10.\xfd;\x9a\xf2?\x90F\xb8\x9a\x89r\xee\xbf\x8265f\x1aL\xe9?\xb0n\xf3\x00\xdb*\xfa\xbfL\xbf\x877q\xb2\xe6?D\x13rg{\x91\x03\xc0:\xe0\xe9\xd2\xef\\\xaa\xbfz<\xb6\xa7E\xf6\xd6\xbfw\xde\xe2\xba\xc6\x01\x07\xc0q.\xd2\xda\x7ff\x10@"`\x9b\xc5\x90G\xb8\xbf*0rV\xd8O\xb9?\xee\xbf}v\x08=\xef?IH\xb5TBx\xf5?\x1a\xa3rh\x1a\n\xfb?\xb8U\x9c+\x9c\x9e\xdc\xbf\xb7\xc1c\xe1\xdb\r\xef\xbf\xe0/\x82QgZ\xb3?\xa6\xe2\x17\xbc\x05]\xdd?\xa9l\xdf?\xb1\x9e\xda?\x8c\n\xee!gd\xe7\xbfK\xac9>\xf5!\xe9?\x07Q\x02s\xdb\xfb\xe4?\xa2z#\x19\n\xd7\xeb?\xa6kC_\x9b\x8a\xe2?0\xcf\x94\xadg\xf1\x02@\xdei1\xcf@I\xf7?o\x8b\xf2$Z\x83\xe6?\xeeb\xd0\xb3\x91H\xd8\xbf\xd1\xc0\x0ck^\x95\x01\xc0\x96\xf21)`\xb9\xeb?l\xed\x89\xdf\xee\x08\xf0?\xddZ\xb5m\xfcQ\xf5?4\x18w\xa0\xbe\xf9\xf6\xbf\x1b\xa7\xff\x1d\x08\n\xec\xbf\xaa\x08\x85\'R\xac\xc3?\xcd\x8es\x87!T\xfe?X\xbb\x8e[\x9e\x89\xed?\xdf\x8b\xf9T\xe0G\x03@}\xcer}TM\xeb\xbf\xe1\xf8V\xb9\xd8J\x0f@\xe1Zv\x02\xa1m\x12@p\xb4\x0be\xf7\xa7\x10@\xc4\xb7\xf9!m\xb9\xf7?\xf2\x93\x83\\\xe6W\xff?@s\xc2\x92\xd9b\xee\xbf\x03\xeb%\x8b\xf0\xed\xc6\xbf\xa1\xe2\xc9\xcf\xfa`\xdd?y\xddyAR\xc5\xd2\xbf)\x9cScA\xd6\xc9?\xfc\xc4=4\xd5\x8f\xc7?\xd9]\xbd\xef\x01)\xe0\xbf\t\x05`j\xa11\x0f@\x8c\xb7\xf2\xfb\xea\xd0\x04@\xc5\xee\xf2\x9e\\i\xf0?\x1c\xc8\x01y4\\\x13@\xca,\xf74\xf3C\xff?-f\xac\x07\xdb\xce\xf6??\xef\x9b\xd2\xaa\xa1\xd9\xbf\xbc\x1d\x9a&v\xef\xa0\xbfC\xde+k\xa9s\xea\xbf/\x1b"c|\xd7\xe5?d=zH\tJ\xea?\xd2?\xb1rKp\xf0?4@;<\xc5l\x03@-\xd3r\x1co\xab\xed?p\xcb\x9e\xca\x94\xb8\xf9?X\x112\x18\x02H\xde\xbf+!\xa8I\xba.\x10@\xd7\xa3\xc3\xaf\xd8\xe5\x13@\xdf\x8c\xe5\xb4\x0fH\t@}Z\xb3m\x14\x9e\xeb\xbfJ\x1e.\xde\xc2@\x00@\x05\xa8\xd6\xc8\x1b\xa1\xce?\x9d\x12\xdd\xa3\x1b\xe4\xe8?\xeb\x03\x91\xb7\x1d\xb5\xd6?I\xa2V\x8b5\x1d\xf0?6U\x96\xafH;\xf5?63\xb9\xf4\xc0.\xe5?\x92\xe8\x9a0\xda\xe7\xf6?\xf9\x01T\x87UV\x11@\x8a\xd9\xcb!\xc1W\x18@\x94\x1f\x1e\xb40\x9a\x14@\xc8\x8be>-&\x12@\xc6\x9bx\x86\x15i\x06@\x06^\xcer\xb0\x94\x03@\xa2\x1er\x8f\xd8r\xff?\xb5\x06\x17\x81\xf6\x17\xc7\xbf$\xcc\xb2\x14\x03\xb4\xef?QY\xfe\xe3b\xc9\x0e@\xe8|\x8e\xcc\t \x05@\x05\xb4\xa2\x9bQZ\x04@\xb8\'\xa7Vrh\xfc?n\x82\x9c\xd7\xe7\x03\x08@)\xdeo\x07\x93-\x10@\x8aO\xe5\x97\xb56\t@\xd3\xcd\x12X\x01m\x0b@\xb2\x16H\xeb"\xb7\x06@,6\x91n\xcc\xcd\xd5?\xe9\xc1X\xf9\xf6\xa0\xf1?\xc3\x06\x056\xc3\xf0\x94?\xb7m\xef\x99\xc5%\xf3?1)\xb6\x17*\xb1\xf8\xbf\xbf\x95\xce\xd5\n\xe5\xdc\xbf\xd2\xeb\xfe\xeb\xbd\xbe\xd8?\xeeo~\x0b\x0cV\xf5?|\xf5\xf1\x13\x08?\xef?d\x0f\xc3\xbaN\x83\x01@\xbe\xcc\x8c\x91\xab\x1a\x12@\x99\x9e\x83\xda"\xb9\x04@\x86\xaa\xdd\x96qB\xff?\xac\xf2\x18`\xf7?P\t\x97%80\xff?\x8f_\x11\x0cEZ\xef?\x91\x8aR\x17\x1e?\x10@\xe7)}4\xe8\x15\x06@\xe1\xcf\xdb\xa2\xfc\xc3\n@\xd5\xd7\x99v\xdf\x9c\xf8\xbf0\x7f-T\xfb\xf0\xd1\xbf\xcf\xa7\x02T#r\xe6\xbfi6r=\x9b\x1ew\xbfW`C\x03l\xad\xdf?\xc4H\t\x16b\x10\xcf?\x1aj\xb1\x10\x95[\xd0\xbf2\x94\x06N\x98\xa4\xea?\t|Ql\x14#\xfd?\t\x813 \x1c\x80\xc9?\x99\xc0\xf7,\xc4K\x9f\xbfT#\xa1\x1c3\xbb\xea\xbf\xb6\x19\xf6\x98\x89\xd9\xf7?\x83\xf6\x87L\xca\x95\x02@\x8c\xe6\xe0\x9c\xd6\x81\xf1\xbf\t\x8a\n\x94#\xe2\xbb?\xe1\xb7\n\xf3\xc5\xe3\x00@6\xe1=<\xad\xc1\xd2?\x96.\x1bh\xd4l\xea?\x06\xb0*\x19\xd49\x01@\xd4\x90\xd0;\x1ak\x10@j \x02\'[:\xe0?\xc8\x10\x8aOW\xc3\x02@\x96\x00\xdd\xe6\x13\xc4\xe9?\xbf\x95\xd0\x0f\xba\xf1\xe6?\xb7-3\xa8-\x89\xf7?0\xe5?\xc0Y\xfb\xfc?\x1a\xe5:\x177E\x07@\xb5Xn%\x7f\xbd\xe6?\xb3:\x99\x1a\x83*\xf3?NvfY\x01h\xe4?\xd6@;\xe0\xc1\xff\xe7?BOi )A\xdc?!5\x1aT\xf1\xec\xd1\xbf7g\xf4@1x\xf3?\xee\xf8\xab\x1a&\xee\xee?\xd9&\xa0\x9e\xef9\xe2\xbfB\xf3\x0bC\xbbi\x00\xc0\x02V#\x1d\x1az\xf7\xbf\xd9a\x84\xdc\x8a\'\xbe?\xf4\x8dMWH\xb0\xe5?s\xee\x00\x80Q\x89\x04@\x15o\x1f\x03\x1d>\xd8\xbfq\xbb\x85\xd5\xd1\xf2\xff?<\x13T\xd19\xb6\x04@N\x17\x1c\xde\x08m\xfb?p\xd9h7\x1d\r\x14@\xa8v\xd0Z\xe7c\xe8?A\xf5\'\xc2\xceP\t@2\xf9\x9aZ>\x92\xec?"\xca\xc4\xac>"\x06@\xe8\x1d\xa0\xbe8\xab\xff?\xf0\x1aS\x99\x0bk\xf1?u)\xaa\x01\xbao\xf6\xbf\xb0_\xc8\x1cF\x9b\x03@x\x01Q\x02\x12\xdb\xcf\xbf\xf1\xe9C\\\xf7Y\xd5?\x12\xa6\x84\xea\xe9W\xc3\xbf\xf90\xa95\x05.\xdb?\x85}\xcc5\xfb\xaa\xce?\x0f \x83\xc2AP\xeb?b\x05\xef\xcc\xeeP\xb2?B\xdb\xf9\xe1\xf5\x9d\xcb\xbf\x8b\xa2/`\x0c\xe2\xc6\xbf`\xdd\xa1\xb4\xc5\x92\xf9\xbf=2\x1fL\xfe\xd2\t\xc0[\xf1nPhY\xff\xbf\x17\xbb|B\x94\xbb\x00\xc0\x99\x1f\x1bk\xc7\xce\xf9\xbf\x94\x02\x83\x96\xe6\x1f\xd3?\xaf\x1a\xa3B1\x95\xfe?_\xd5\x89r3e\xe3?\x85\xdaW\x83\x9dZ\xea\xbf]\xacJ\x1a\xb8\x07\xd5?\x00\x01\x1e\xd8YT\xe0\xbfR\x80\xa1\x90\x9bj\xf1?\xe3\xcd\x99n\xeb\t\xf9?`\xb7E\xe7U\xc1\xe6\xbf\x02\x88\x0c\xbc\xdc-\xe0\xbfk\xb4F\x17\xf7\xf8\xe4\xbf\xb6\xdf\xdfu\xfbf\xe1\xbf\xbf\xc5\xd3\x97!{\xf8\xbf\xd7\x90P\x8e\xf4m\xc5\xbf\x93\x1a\\\xd8\xb7\x90\xe2?)k\xbe\xefFW\xa3?\xaa\xcep\xb6\xcc\xee\xf3?\x81\x11\xb1\xd9mk\xe2\xbf+\xd0P]\x00p\xd0\xbf\xbb\xd2\xaf\xf8P\xbd\xf4\xbf\xf22n\x01\x01\xbc\xc2\xbf@\xdf\xb1\xce\xe1i\xd3\xbf++\x00\xd7\xbfo\xda?\xf9L\x03\xca\\*\xd6?\xe5\xbdS\xd5\xbe8\xc0\xbf\x95\x99Ui\xdaZ\x00\xc0q\x8a\xd2\x96\xe6\xd5\xf9\xbfm\xb9\x01[\x95\x10\x00\xc0\xbc\x10\x05x\x9f-\x13\xc0\xbbd\xbc\xb9\x8e\xfe\x05\xc0Y\xc9\xd91\xdc:\xea\xbf\xce\xf7(\xf8\x94\xdb\xeb\xbf\xea\xb8\xc9\xce\xab\x87\xb3?e\xc1\xae\xe5\x86>\x04\xc0Ks\xd0\xfcp\x87\xc2?;9\x1b\x0f4\xb8\xd8\xbf3\x86\xf6\xa5\x80\xae\xfd\xbf\x9a\xb8\xb3\x1c\x87\x9a\xe9\xbf9E\xa7\xfaq\xd4\xf2\xbf\xda\xdc\x874\x94\x91\xe6?\xd1g\xb8\xa4x\xad\xe4\xbf^\xbf_\xcd\xbf\xb0\xc6?<\x85&6R\xa5\xe5\xbf\xaa"\xcbG-\x1a\xf5\xbf\x88\xd2\x11T\xb5\xe5\xe2\xbf\xec\x127\x1f\xc5\xc0\xd9?\xdaB\xc5\x07\n\xe3\xe5?3\x0e\xc7_\x92\xeb\xf0?\x19\xb3\x1f\xeeRY\xc3?\xfa\x01\x9d\xa3\x9bf\xf2?W\xb6\x10\xfee\xab2?5A)\x05\x15\x83\xe6\xbf\x05\xb7\x0cO\x81\xdf\xd6\xbf\x0bim\xfb\xbcX\xf8?7\x8c\xfd\xea\xadQ\xd1\xbf@\xb7K\x18\x10$\xea\xbf\xb3\x8b\x86\xed\n\x98\xa4\xbf\xe7\x10\xa9-@\x06\xe5?E7\xb0\x83\xfe\xe5\xe6\xbf\xa9\xd3\xbf\xd0a\x04\xed\xbf\x069\xc1\xb46\x1a\xe4\xbf\xc9-\xf2\xc3\xac\xe9\xe3\xbf\xd5\x7fA\x8d\x97\xca\xec\xbfs\xf8\x8c\xbe\'\xf4\xc8?\xbd\xef\x8aM\xa23\xf3?\xe0U\xc4\xc3!\xfb\xc5\xbf\x8d\x8f\xaaO\x0fp\xe9\xbf\x8e#\x19\xb5\x0bO\xe6\xbf\x88,dLk\xf2\xf2?\\s\xf7=\x05\x8e\xd6\xbf*\x04\x8b,N\xfa\xe6\xbf,\xf8\xb8\xe9I\xda\xd4?l\xd19\x1dqJ\xf7\xbf\xdd\xc1u\x17 \xcf\xe0?\x00\xc4\x8a\xbc \x12\xc7?@\x02\xe3\xec4\x1b\xe7?\xa3,yQ\x02\x07\xc3\xbf\xbf\xc0\xa5\xb7\xc6K\xe6?\x8d\xf4\x02 vC\xe5?m\xe9Lf\xc7\x90\xf2\xbf3\xfb\xec\x1am\x1es\xbfP\xe7fr@\xc5\xeb?8\x8eu\xea\xd9\xeb\xea\xbfI\xbd\x9d\xde\xb30\xda?\x19\x89\x82\xef\xc5\xd7\xf4\xbf\xef\xaa\x9d#\x88$\xf6?\x05W\xe8V\xe6\xa3\xcf\xbf\xa4\xa9\xe8.\xfeE\xc6\xbf\xec\xd9m\x97\xdcI\xe1\xbf]F\xb2\x16B\xe7\xe2?,WR\t\xe5\xaf\xe2?\tK\xe9\x87$(\xea??\x0bM\xd9R\xba\xb6\xbf\x88F\xe3\xb2\xc3v\xef\xbf7^\x89\xd8j#\xc4\xbfY8c6\xc6\xdb\xe8\xbf\xca\to\xbf\xec\xf0\xd9?w\xe0\x13\xad\xb9\xeb\xe9?\xaa\xe8\xb7\x92A\xe9\xf7?\xcc/\xcb\xae\xb1T\xd3?\xf97e\xa4a\xab\xf5?\xd6\x06:nh\xb0\xde?R\xd6{\x89\x90\r\xf0\xbf\xa7\xd1\x0cD\xff\\\xef?$\r\xc6\x91\x16\xf1\xfc?\x9c\xca\xe3\xda/\xbb\x03\xc0j-S\xa7\x98?\xfe\xbf\xd0\xe5\x9b\x92\x11\x82\xd2?K\x88&\xbf\xc8\xee\xf6\xbfhB\xa6\x02\xe3\xb3\xe0\xbfC\xee(b\xda\xe6\xeb?\xfb!\xef\x1d\x12\x86\xe9\xbf&o8x7\xd1\xf0\xbfp\x16\xcc\xd4W\xeb\xfb?Ua\xa1i\t\x1e\xb7\xbf\xdb\x10\xc6\xc1vQ\xd4?N\xdc\xd7\x0f\xf7\xda\xb2?\xf1k\x0cF\xf5T\xca\xbf\x8f(q\xdbU\\\xdc?\x8b\xde\x162\x92\xbd\xc0\xbf8\xb80"\x88\x86\xdd\xbf\xdaa\x8b\xb21\xa4\xb3\xbfD\xb2\'\x859\xca\xd3?nw-\x98\x03\xc5\xd7\xbfaj\xb3\xacn \xe1\xbfr]\xff>V\x90\xda\xbf\xfa\xec\x1at\xd0x\xd3?.\x0b\xe5\x1a-]\xd0?5,\xbc\x87R?\xf5\xbf{P\x1a\xdc\xbe\xbc\xf0?\xe9\x86\xceHq\xe4\xd6?\xbd\xb0\\^w\xd6\xf2?\xa5\xe0\xf0\xaf\xf8\x99\xc4?\x02\'/\x11qy\xf3\xbf[\xda\x8e\xfd\xa2\xee\xe7\xbf*Wa\x96\xb8\xb8\xd0\xbf\xef\xb6\xed\x8d\x03\xa0\xe0?\xd9\x045\x1cR\xac\xd5?\xd0!\x9b\x9c\xb5!\xea\xbf#SgZ\x9a\xa0\xe2\xbf\x19\xc7\xf9\xf26\xe7\xc4\xbf\xe2\xd7`\xbd\xc0\x97\xe2\xbf\x95\xa4j\xb5f\xac\xc9\xbf\xc9\xc2\xdb\xf6Ka\xf5?^\xdbE\xa4\xdfb\xf4\xbf\xc7\x95\xd6\x01X\xcf\xb9\xbfsk\n\x9e\x9a\xf2\n@\x8c\xd4\xb6\x919\xb6\xf2\xbf\x1c\xce\xa6\x8b\x88\xb2\xc0\xbf\x86\xb8i=J\x85\xc9?\x9e\xfc\x94\xfa\x8c\xbe\xc9\xbf,i\x03C\x99\x87\xef\xbf\xe3\x04\xa5\xdb\xcd\xb0\x95\xbf\xa76\x00t\xcbL\xf2\xbf\x1d\xac\x86\xc7\x8e\x9a\xdf\xbfo_U\xd4)h\xda\xbf<>\xd0\xe5z:\xf5\xbf\x88\xccQ8\x943\xd8\xbf\xeb\x0fJi\xbe\xaa\xd6?q7\x06\xda\xb5r\xe1?&\x07\xcb\r\xeb\x8b\xd3?\xa4h\r\xc4I\x89\xb5?\x1dI\x00\x01|H\xb5?i\xba\xf1\x04\x1b\x07\xba\xbf\x1f\xc0L?\x11U\xdc\xbf\xe7\xf6I\x17u\xa6\xde?`\x19\x19\x8f\xad\x86\xe9?\xe2\x8e\x0c\xb3ag\xe7\xbf\x8d4\xdc\xe1%\xe1\xd6\xbf\xa8f\xea\xbfH\xe3x\x8b\xb0>\xb4?\xa0eT\xc14\x16\xe9\xbf\xdc\xb0\x91\xa0\x04\x18\x00\xc0\xd5\x19\xd7v\x96\x1c\x05\xc0$\x17\xed*\xef\xf6\x04\xc0|\xe8\xea\x04%\x05\x15\xc0\xb2&\x1e\x16\x14\xa3\x00\xc0\x8b\xf7\x8d\x896\xdf\xf9\xbf\xdd\x9a\x0c\xed"\xe5\x01\xc0x\xf2\xb5\x15\xc2\xfd\xdf\xbf\xca7!\x8cWY\xc6\xbf\x18\xa6\x9es\x96\xca\xe8\xbf\xaf7\x11\x14\x9c)\x08\xc0KZ\xd5\x90\x98\xe6\xb2\xbf\x91\xd2C\x18\xdde\x06\xc0U\xfe[>[ \xee\xbf\x8e\x19\x03\x9aj\xa2\xd4\xbf\x84\xd1\x984\x1b\x15\xf4?\x9c\x16\x05G\x8dx\xeb?\xef\x15MA\xac\xa6\xec?\xd5\x8e\x12wG\x9a\xf3\xbfZ\xe0r}q[\xbb?A\x13\xb1\x85\xd9C\xe5\xbfL\xaf\x00_\x8b\xfe\xe3?\xdeG~\xa1B\xbbp\xbfuCo3\xbf\xe6\xd4?\xab@\xb7\x9e\xf7:\xd0\xbf\x1d\xdf\xe7\nfs\x00@\xb2+\xa7\xb9\n\xd3\xdc?\xa3\n\x9b\x04\x9cv\xf2?o7.\xb9-\x0c\xfc\xbf\x9bk\x88\xd7o/\xf2\xbf\x1aD\xa818\xbf\x07\xc0\xb6Q{\xee;4\xf6\xbf\x1a\xe3z\xe0[\x13\xdc\xbf\x8a\xcdDU\xd5\x14\xf8?\x10\x89Aj\xc2\xdc\xee\xbfE\x05\xb1\x8b\xb6\xe0\xec\xbflR\xcb\x03\x0bQ\xf6\xbf\x89\xd9\xd2U\x92\x16\xed\xbf\x91\xdd\xc1\xe9,%\xf7\xbf>\xc5\xe5\x03j{\xa0\xbf\xf3\x98\xb5\xf7\x98e\xf3\xbfzY\xd0\x1b\x0f\x01\xf2\xbfdfH6\xbfT\xfc\xbfd\x98@9ii\xd0?\xc2\xa77\xce\x13\x0b\xd8\xbf\xe8\x11t\xf9h&\xf0?\x97\x82\xf3}\xf07\xfc?{\xd4\xe5\xd7\xb9\xe6\x00@3\x17f\xc0Q\xce\xe7\xbf\xd1Zf\xf7\xa5%\xec\xbf\x15\xe8\xe5\x9d\xdf\xf7\xcc\xbf\xc7v\x05\xce\x8fc\xf5\xbf\xa4=\x05LRs\xd0\xbf\xc0+\xd4n\xf4\xa1\xf0?Y\xd8\xaf\xf5\xaa\x17\xc1\xbf\xaf\x19dY\t\xbc\xc3?\xd7\xb7\x0e\x98\xce\xcb\xea?\xed\x9d\xec9\x0f\xa5\xfd\xbf\xb9\xd8<\xbb\x0e;\x04@(\xd1\xd9\xb5\x87G\xfd\xbf\xec\xf8<\x9d\xc7\xb3\xe5?4\xaf\x16F\xfe!\xbd?lX^-\xa7\xc9\x00\xc0\xd3Yfn/\xed\xe0?;t\xb6}\xac\xd3\x01\xc0\x1a`\xbd\xb8\xb1\xa0\xcc?\xcds\xb2\xde\xca\xfe\xd0?hA`\xdbD\xea\xdf\xbfE\xa6w\x91\x03+u?\xe7\xcf\x8c\xd3\x84\xa5\x03@\x94\x1d3\x82\x9f\xeb\xe0\xbf\xad\xe8{\xd7B\x16\xf8?+\'\x0eN\xf9.\r@!f\xbfa\xc0\xea\xf4?\x07\x87NO\x15\xc5\xb3\xbf\xcc\xb4A\xee\x08\x14\xf3?e\xa2\x8e\x08R\xb0\xb8\xbfY\xd4H\x10\x9f\t\xd6?\xd9\xf4\xef\xa9\x15\x06\xc0\xbf\xda\x83|y\xa8\x1d\xe6\xbfW\xdfG$W5\xd3?\x9f\xc6\x1f"\xd0O\xed?/\xf9_\xb6\xc3\xef\xe7?\xbd\x0c\xc9\x02k\xcb\xf3?n\x8c\xd2+\xbdL\xf2?!\x17x>\xa1\xeb\xfd?\xfe:\xfe\xa8\xfb\xa8\xe8?h\x90\xc3Ad\xc2\xe5\xbf\x85\x9fr\x1d\xb7#4\xbf\x90\x881\n\x13\x0c\x06@\xd7\x06^\xbe(\xdc\xf0?\xdf\x06\xaf0Ta\xf6?\xf7>\x9d\xedCR\xeb?\x99d\xf2\x1a\x9d\'\xce?\x1d\xa9oq\xa3\xd6\xf6?\xcb?=\x93B=\x06@Pc~\xcd\x03:\xf9?\x8c\x06&I\x83i\xf6?\x18\x83F&S\x81\xef\xbf\xaa\xd8\xa8;`\x99\x01@\xc2\xee\x82[\x1a,\xca?\x1c\x04\xc4\xb0\x92\x11\xff?\t\x93]B\x15\xdb\xf6?\xf0\x1dT\xff\n\x9e\xef?h@\x14\xae\x1b\x91\xec\xbfL\xd2k\x1e\x88_\xdd\xbf[[Z\x11\xd2\x15\xea\xbfc\xde\x91\xfcF\xd2\xe8?U\xeb\xd9\x13NY\xf5?\xd4wD\xff+;\xa6?\xbc\xfc\x85EY\xfa\xfe?\xeb\xec\xa9\xd5\xe7\x0c\xf5?x\xe9&%\x9e\xa6\x03@m\xcd4\x8acS\xe8?#\xbb\xad\x04\x9a\x96\xf0?\x86o\xa7\x16Fm\xe7\xbf\xa1U\xd0*r\xc8\x0b\xc0\x870.\x8e\x87L\xeb?\xd1\xa4\xb2Sd\xea\xd0\xbfB\xff\xf1\xa0\x9c*\xef?\x9b\xbc6\xbag\x04\xf5?\x7f\xc1[S\x1b\n\xf3?\xe3\x8c*\xd2\'~\xfa?V\xb0r\xac\x17\x0b\xf2?\xab\x18\xf5\xccG\x87\xe5?.pe\x9b\x04l\xe0\xbf\x80\x04\xc7\x85N\x18\xd9\xbfm!\xd3\xac\xa6\xb0\xc9\xbf\x90\x85\xa7<)\x8a\xe6\xbf\xbf`\xc0\xf83\xdf\xfb?\xd5\xd5\xf2\xad\xb6\x85\xf1?\x87\xa5-r\xb2\xdb\xb7?DJR_\xe6\xe6\xd5?\xf6\xb8\xa8]\xce%\xf5\xbf\x0c\xc5\xb2\x99\x1d\x17\xf0?\x15\r\xaf\n\x8a\x02\xf4?\xa9\xa1\x85a4\xe5\xe3\xbf(\x13\x8b\x9d\xee\xcb\xe9?`\xff]\t\x83\x1e\xf7?\xfc1\n\x80\xb9\xe1\xe7?.\xb0o\xf1\xd2\xae\xff\xbf!\xd4\xac\x8a\xc5\xcb\xfa\xbf\xaej$\x13\x10E\xf2?Y\xcf\xba&a\x95\x02@!\x11\xe0\x17\x88\xdb\xb3\xbf\xdc\x0b\x13\xb8B\xf1\xd3\xbf\x06\x9d\xea\x81\xc5\x91\t@\xaba\xa0m\xb5D\t@\xb4\x8bQ\x8b5\xf7\x14@\x9b\n\xc5C\xdd\x9e\n@a\xca\x18\x85%W\x01@_\xc1v\xfa\xde\xbf\xf2?\xfb\xf6\x84\xf4\xad\xd2\xf9?\x07\xeda#=\xfd\xe5?u\xeat\x08h\x1f\xff?>\xe3\xed\xdcM\x92\x97\xbf\xf0\x7f\x92\x8d\xc8 \xd4\xbf\xab\xb2\n\xda\x19\xed\xe6?/\xb0\xc1{\x1cE\x04@\n\xa7\xecG\xbb\x13\xe3?y\x8bJCEO\xd7?\xf8F\r\x1d\xf2\x06\xc7\xbf\xcb\x8d\x92\x0c\xcb\xd5\xd0?3r\xfeca=\x02@\x01wUn)l\xf5?\xc4.(\x89J\x15\xd7?0\x03\xed\x06\x8f~\xe3\xbf\x01\x94\xd9\xb0w\xa6\xc4\xbf\x83\xfd\xcce\x17\xbe\xe9?xvCy\xbcu\x00\xc0q\x03y\x01<\xbd\xd6?\x0e\xbeZ\xf38\xd4\xe0\xbfR\xd8\xd2\xbf\xd0#\xf7\xbf\x17}\x8d\xbc\xff\xaa\xa3\xbf\x12\x16\xfe\xa2\xe0\x82\xde?K\x15@z\xc63\xfd?\x17\x10\xc1<\x07\t\x00@\x14\xfb$\xe3\xf9\x1c\xf5?\xf2\xd5\xa9&\xadG\xf6\xbf\xf1\xa1\x864\xd4\xc4\x01@\x80x\xffc\xf4\xe7\xf5?\xf9Q\xff\x89\xf2\x94\x01@\xa3S\xd1s\xd9\x17\xfb?n%{\x1cK\xa6\xbc\xbf0:\xe6\x1f\x05\xe3\xf2?R\xb3.=\r\x85\xd4?8m@\n\xba+\xf6?\xd9\xc9HXV\xd2\xe5?\xe2\x87D\xad?~\xec\xbf\xe5\x96\x19|\xce\x9b\xd0\xbf\x01\x97m\xfbd\xb9\xce\xbf,`\xaf\rG\xcc\t@\xf9\xe0\xbcF\x06\x9f\x02@_\xbb/x\xc0\x9e\x06@\x05\r6\xc1\x81}\xcc?\xcd\xba\x93\x93\x8fO\xe3\xbf5\x9b\xc8\xbdN\xc8\x11@\xd8\x90{3\x9f\x90\xf2?\x0e\xe5\x99q$\xc9\x00\xc0\xd7(\xc7\xd9\xf3\xaf\xfc\xbf\xf2q+f.\xe1\x03\xc0\x9b<\xa6\xc55{\xec\xbfrlTN\xac\x1d\x06\xc0\x1a\xa4\xfb\x8d\x1a\x19\xea\xbf\xde\x1a\xdf\x8b\xfd\xbe\xe2\xbf\xbb\x87\xc5\xb3D\\\xd6\xbf\x9e\xb3\xed-\xbe\xf9\xf2\xbf\x90\t\x8e/b\xcc\xf5\xbf\xe0BpS\x819\x0f\xc0N\xd4\x19\x85\xf0\xaf\x02\xc0\xcb\xfc9S6:\x02\xc0\xde\xf3\xe5?\x94\x90\x01\xc0o\xc2gz:\x11\x10\xc0\xb0\x804\x1f\xca\x01\x0e\xc0\xaa\xdcI\xc4\xe0y\xff\xbf\x03\xc77\xf9:\x8e\xf2\xbf\xa9\x92\xd5\x852I\xbe?\xb4r\x1c\xa9 \x8a\xd6?\x13\x9bJ\xbc\xa1\x1a\xbf\xbf\xcaD\x0f2\xc1\xad\x8b?\nr)\xb4^S\xb0?}\xa0\x8b\xc1\x06\x98\n@\x88\xdc^wA\xcb\xf5?\x9d\xf3I\xdf\x81D\x91?sb\xa2k\xf4\x8d\x00\xc0~\x84\xbc\x84\xf0s\xf0?\xd9\xdeZ\xdf\xb8\x16\xdd?q\xcda\xb3\x94$\xf3?\xaa\r\xfc\xa8\xc9G\x0b\xc0\x1fg\xb3\x1ebP\xc2\xbfJwV\xe0\xde#\x00\xc0\xcf\x977Q\x8e\x06\xe6\xbfxYN\xb4"\xce\xf7\xbf\xf5w\xe2Y\xe29\xc0?G0\xc8\xcc\tS\x00\xc0\xd4\x83\xc7C\xe8\xc4\x07\xc02-*\xffU\xdf\x06\xc0\xb4\xff\xf9\x11\xb3\xa5\xf4\xbf\xa9\xcf\xa0\xf8r\x85\x04\xc0:\xce\x8fC\xd9?\x13\xc0\xc6\xeb`\xb2r\xc6\x08\xc0\xbe\xef\xfd\xa6\xd0r\xf7\xbf\xeemq\x91\xceE\xd6\xbf-\xdd\x08\x17>\xe3\xc0\xbf%\xc5\x1b\xb3\x82\x1c\xe9\xbf\xb68\xeap\xac\xb1\xd5?\xacD_+\xdd7\xdc\xbf\xf5\xd6\xe3\xac\xd6j\xf8?\x84\xda\xec\x83\x93\xcc\xf5?\xdc\xba\xabz\xda\xb7\x00@\xa7\xff\xed;8<\n@\xfdB_.\x1c \xb7?K\xeda\t(\xfc\xe1\xbf\xe5N}\xa087\xeb?\xc9kN\xbd\x9a\xe6\xd4\xbf\x80\xf1\xec=,\x14\x04\xc0%\x19*\xfb\xf2b\n\xc0\xf9\xe8N\x00b\x9d\xeb\xbf\xa1\x12\x9c\xec\xd2E\x0b\xc0\xcf\x84F9\xdc\n\xe7\xbf{\x89\x8aQW7\xf4\xbfG\xba\xbb\xee\x7f9\xd0\xbf1[F\xc9\xc4\xd5\xf3\xbf\xf0\xf9\xc2\xf1\x98\xdb\x03@\xa3\x1cD\xea\x83$\xfa?PB\xeaSz\xad\xf6?\xce\x8c\xb1 \x80l\xf4\xbf\x16\xcb\x93\x08\xca\xd5\xee\xbf"R\xb2\n7\xe5\xbe?;\x94\\\\\x9d\xf1\x05\xc0\xd4\x81NV\x8aX\xd6?\xd3\x15c\xed\xf3t\xf2?\x9c\x90\x87\xb7\x91\x85\xc9\xbf\xf4\xfa\xe8u\xde\xf3\xf6?\x82 B\xdf\xe0K\xf1?J\xd3\xc3\xf7\xf8G\xf1?Z\x91\xaew\xc3\xa1\xe7?&\x03\xf5)\x10 \xfe\xbf\x87,\xdd\xf2.1\x0f\xc0|\xd5\xe1\xed\t.\xc9\xbf\xe2\xb8\x8d\xfbH/\xe6?V5l\x12+I\x05\xc0\x062\x979\xb6\xe1\x08\xc0\x8bQ\xe6#z\xa3\xf5\xbf$\xf4\xae\x9d\x94\xa9\x93\xbfH\x7f\x07\x08\xe2\xac\xef\xbf\xd0\xc7v\xeb\x0e%\xef\xbf\x82\x9a\xfa7\x9c\xb4\xd5\xbf\xf6\x15.\xa4\x1e\xf5\xf9\xbf\x0c\xb2"\xc4h\\\xee\xbf\xbb\xff\xc4\xecB}\xaa?\x7f\x01\xe9\xac\xad]\x03@\xed\xcbVT\x04\xb5\xd7\xbf]2\xb5\xd2s0\xdb?\x9eQ\xe3\x1d\xa52\xce\xbfk\xeb\x06\'\x00\xeb\xef\xbf\x83U\x89%64\x03\xc0\x03\xadAk\xc4y\xb1?\x1f\x0f\x1f\x91\xa2i\xf6\xbf\xd3\x8d\xa0z\x12\x84\xcd?\xber\xb2\xff\x03G\xe2?\x17t\xe8d\x9a\xfb\xd5?F \xf4\x8cE\'\xe7?k\x07%\xdc4[\xf0\xbf\xe6\x04\x9d\x8bx\xc0\xe0\xbf/\xa8\x0f\xc6\xa6\x97\x01\xc0\x1c\x80&\x02\xba\xed\xfb\xbf\xd9\x1c\xfb\xde\xaa>\xe1\xbf\r\xac\x0b\xf3\x82\x19\xf4\xbf*\x89\xdb\'\xaa \x0b\xc0\x91r\x99s\xe7J\xe6?\xbe\xad\x87\xbb\x99\xd5\x04\xc0`7\x8b\xe8&v\x80\xbf\x9d4\xc9\xab6u\xea\xbfL\xdc\xc3\'\xaa\x9f\xd4?\xc9\xc2\xff\xf8\xfe&\xf3\xbf\xcf\x1b\x00\xd3f\x9a\xd4?oY9W@\xba\xe0\xbf\xda\x88&8\xf1\xc0\xd6\xbf\xac_\xad6\x1d\xa8\xfb\xbfs%\xf7*q\xe5\xe4\xbf\x82\x93j\xd1)=\xdd?\xc1\xe0q|E\xfc\xec?\xa7\x12\x90\xaf\xd2Q\xf9\xbfu*\xfc\x9a\xeb\x06\x03\xc0\xd7\x9f=\xd5\x98@\xf5\xbf\x1c\x00C\xa3\xb6\xa3\xfa\xbfj.;\x96\xf9\x96\xe4\xbfh\xb5n\xcdI\xff\xe7?\x19\xd0\xd4\x0f\xa5D\xe1?\xe4\x7fd\x7f\xc0\xc9\xef?\xefC\x1eF\xf9\xb8\xe1?\x880\xc3\xec\x93S\xfc\xbf]\x0f\xbb\xf1\xef\xf7\xaa\xbf7^\x90x_\x02\xf2?h\xbej$\xc51\xf6\xbf\x02\x1e\x0c6\xf4\x9c\x07\xc03\x7f\x13\x14\x1e\xb8\xc0\xbf\xe6\x0cd\x9d(\xe9\xf5\xbfG\xce\xd7V\xe6W\xe3?\xe6\xc5\x9f\x9a\xfeC\x00\xc0\xe6\xff\xe0\xe5\xc5\xde\xc0\xbfi\xe4\x12\xf0#`\xf7?\xf3\xe0\xaad$\xe2\xdb?\r\x7f3JY3\xd7?yT\xed\x8d\xe5f\xe5\xbf\x0f\xd8\x1e}z\xe7\xba?\xa7|\xa6\x13G_\xce?[6\x07{\xc6\xdc\xe8\xbf\xac\x1f\x15?\x18}\xf3?\xa3d\xf6-\xd93\xf9\xbf\x17\xcb\xfa\x86S0\x00\xc0\x11\x15\x19j\xe7\xfc\xee\xbf\x9d\xcb\xf8\x05\xa1\xfb\xfb\xbf\xf8\x80\xda\xd1kS\xf8\xbfl\xbb\xb5\xc1\xdb\x87\xf3\xbf\x18\xa6\x8b\x84$A\xee?\n\x0be!\xba\xcf\xc2\xbf;(\x90m\xef\x14\xea?\xe5%` \x88C\xc9?oL\xe3\x08\xbc\xb8\xf4\xbfqlnh=\xd0\xf5\xbfc\xc7\xab\xa8\xfb[\xf7\xbf`\xa6\x1d\x8b\xdb\xc9\xf6\xbf\xcf/rE\x84$\xea\xbf\xf9b\xac\xc2w8\xe0\xbfd_1x\xfe.\xe2?\x9b:H\xef,\xfd\xfb\xbf]\xcb\x11r\xceG\xf0\xbf\x1d\xa32&\xf7U\xdf?\xd4$\xdbK@\x0c\t@\xec5\x88,\xe2z\xd2?\x87\xbbkh\xed\x14\xa0?\xf3K\x87*\xd9\xfe\xf4\xbf;\x10\xbc\r\x82x\xf0\xbf\x97\xf9p\xd9\\o\xd9\xbf\x8eq\x90#,\xf6\xd0\xbf\x17\x97\xc7cXe\xe5?\x112\xd3\x91\x17\xe7\x00\xc0\xbfi[\xdb\xbe\x99\x0f\xc0\xdc>\xa2\x83\xe8y\x08\xc0\xf1+\x97C\x97\xff\xfc\xbf\xb1\x87V>;\xcc\xd5?\xb80\x11gz\x11\xc8\xbf%\x9f\n\xa6\x9b\x1f\x96?\x89A\x8c\xda\x7f!\xb0\xbf\x8d\xb89\xcc\x15I\xc2?\xefT\xa5\xf3\xce\x1b\xfe?\x01\xea\xf3\x9c\xb6\xae\xfd\xbfU\xac\xc2W\x95\x0b\xe1\xbfj\xcf\x94\xf6\x82\xb7\t\xc0\x04\x7f8\xfe\xbcG\xfa\xbfKIFpE\xd3\xf7?\x84\x8ex\xf4\xb3\x9f\xf4\xbf\xfb\x92\x15\x9cI\xba\xd7?\xe7\xa6\xf4c\xf5\xa5\xe5?\x17\t\xa6\x1e\xa0\xb8\xdb?K\xec\x1a+\x932\xf2?j\x9d\xef\xd3\xf1\n\xd4?\xbd,\xaf\x16\x8a\xd4\xf7?}\x98l\xfc`\x07\x03\xc0\x16\xb0A\x9cj\x08\xe3\xbf\x1d\xc3\xc9i\x01\xc0c\x05\x11\x00\x83\xc4\xcf?-\xfe\xc0v\xde#\xe2\xbfJ$F\x94\xe0T\xef?B\xf2\t\xcd\xbf\xcf\xde\xbfc\xbc4\xf1~\xf4\xe1\xbf\x14\xb0\x81\xcb\xebP\xd9?\xbe\xf1\x00\xf2\xca\x0b\xce\xbf\x1d\x85\xc8?M\x8a\x03\xc0\xd4\x0b\xfd$\xc3\xbf\xdc\xbf&F\x9f\xed0\xe6\n@\x1a\x10\xb8I\x81\x93\xe8\xbf\xcdLH\x98\xb2=\xe6?,\x0f\x920K\xd0\xda\xbf\x1f\xf7\xb0\x9aM\x05\xdf?\x97\x05m\x93\x80\x0b\xe7\xbf\xc9\x84\xd8n\x83)\x03\xc0\xd8(\xea\x15\xc3"\xf1\xbf\x8c`\xe0\x8b\x80\xbe\xea\xbfp\xeb$b\x12%\xf9?nb\xaa\x10\xcb!\x00@^#=h\xad\x04\xb7\xbf\xc9\x03\n\x9c.\xfc\xc1?\x1b \x10\'\x05\xb4\xd8\xbf\x18\xa5\x80\x86s\t\xd2\xbf\x17\x00s\x10\xb8\x06\t\xc04\xd1R\xe1\xa4*\xf4\xbfg\x17\xd1+$\xb3\x03\xc0\x05m\xfd\x082\xcb\xf5\xbf3?c\xaf`\x00\xf1\xbf\x06J\'\x07\x05\x84\xe8\xbf\x1d#\xb8\x0b1|\xd0?j\xf0\xa0#Z\x1c\xc2?bJ\xe1\xf5i;\xa1\xbf\xbd\t\\\xa9Em\xce?\x9c\xc2bkn\xc7\xe1\xbf\x07\xfb\xads2\xa2\xfe\xbfk.]\x90\x8eY\xee\xbf\xbf\nn\x8fL\xed\x02@\x0b3\x9c\xed\xc2\xb7\xed?\x84\xef-]5\n\xe1\xbfy\xa7\x80\xaeC\x8e\xee\xbf\x99\xb0\xbc\x9a\xfa:\xe5?\xd4\x80+\x9f\x10\xa4\xe5?\xec\xaf\x0f\x9bCg\xf0\xbf}0\xeb&f\t\xee?\x14[\x89\x18\xd3\xfd\xc0?\xb55\x98VR\xf3\xfe\xbf\xf9\xd0\x91\x11`\xb4\xdd\xbf\xbf\xf9\xeew\xb9\xd4\x06@\xd3\x0e\xab\xde\x15=\xfc?U\xdf\xf9}\xa8~\xf2\xbf\x11\x17\x90\x99)\x8d\x10\xc0\xbb\xf9\x86"[\x1b\xee\xbf\xa1S\x1c~\x90\xf2\xf1\xbf\xa2[\x12&\x15\x19\x01\xc0\xb3\xc8\x9cdD)\x01\xc0\x07\xbc`\xd9+\xf2l?\x90\x1f\x01\xf7\x1f0\xc0?\x95;a^\xe6\x80\xe2?\x9fQt\x98\x9f\xc3\xe9?\x93z\xe9\xe9:\xc6\xd3\xbf\xe3gR \xfb\xb0\xd4?\x93~\x9eB\x91D\xf6\xbfs\xdcO\x17\x8d\xdf\xed\xbf\xe2\x99\x18\x1e_\xf6\x00\xc0~\xb0\x16\x08\x83^\xe7?\x95q\x16&\x14\xa7\xec\xbfKa\x05\x1a\xbcH\xdf?\xb1\x9f\xed\xe8\xf0&\xed\xbf*6\x19\xe5\xb6\xf0\xf3\xbf\xbep\x17s\xa2\xdc\xf9\xbf\xc7`Ja\x12a\xd2\xbf\xb6\xf0\x11\xcaS\xda\xfe\xbf?\xc5a\xea\x9b0\xc8?\xa8K6E"\xc3\xf9\xbf!8\xb51\x7f\x83\xe8\xbfYW\x95N\xef\xee\x0c\xc0=\xd1\xf7\xd6O\x1b\xe6\xbf\xa8\xcdeVS\xa9\xfc\xbf\xde9\xcb\xb7(c\xf8\xbfcx\x96\xb0!R\xf2\xbf\xae\xc2L\xbb\x1d\x95\xe0\xbf\x93}\xb7U\x88\xcb\x00\xc0\xd1\xf6]\x18\xd9\xa9\xea\xbf\xb6\xe1*Tm\xd7\xe4\xbf8\xe1,\xd5\xbf\xdb\xb4\xbf\xba\x1b\x83\x93k\xdb\xf9?<\xfd\xfedL\x00\xf8\xbf\xf3}K=\xe2\x10\xee?\xefl2\xado9\xe1\xbfo(\x94\xd4X\xc1\xd9\xbf\x0e\xa1|5\xd8#\xe1?\xdc\x86\xb8\xca_e\xde\xbftG\x1em\xcbC\xe8\xbf\xa0\xb7\xd0v\x0f\xee\xe0\xbf\x8f\xe7\x1ez\x0f\x15\xf3\xbf\xd3\xac\x10p\xdaX\xd5?\xe7^\xbb\x96,\xb2\xe3\xbf\xfb\x86\xbfQ\x05\x89\xd7?\xfd\xd8&[\xcf#\xdc\xbfI1O\x05Q\xe6\xe8?&\xb1\x1a\xbc\xeb\x03\xe4\xbf\x17\x10\n\x8aW\xa6\xc4\xbf\x9bb\x13\x1cF\xc3\xf8\xbf\x16\x0f\x10\xf4\x00\xc8\xfd\xbf\xe88`\xd9\xbf\xdd\xf6\xbf\xd7\x0eU\xc2\xfa\xc4\xd2\xbf\x9b8\xa4Q<\xc1\xb0?R\nw\x1a\x91*\xd2?PQ\xd5\x94\xb7\xfd\xda\xbf\x83\xc8Q\xe0G\x92\x97?<\xb6\n\xbb\t\xfc\xe3?\x11\x8d\x16/\xb4\xfd\xc5\xbf\x98@#\xc9\x95[\xd1\xbf 4\xa3\xdc.\xda\xc6?yf\xc5a\xde\xf2\xe3\xbf\xfb\x1f\xa1s+\x18\xb4\xbf\xc8a\xdf\t\x18\xf2\xda?|\x9cEY-\xe6\xf6\xbf\xa4\'\x89c\xc9\x95\xe6\xbfs0\xd3\xc0M!\xfe\xbf\xee\x86Y\xc9i\xc1\xdf\xbfr;\xfbK\xc7\xa0\xf5\xbf\xe9\xaf\xee\xc3\x85\xd5\x08\xc0\xcdV$x\x9e\xb7\xe3\xbf\xff\xa3\x07\x1ft\x96\xe4?\xc9\x06\xdf\xa4sE\xff\xbfL\xce\xed\xce\x8b\xd0\xf6\xbfP\xef\x81;\x85\xdc\xed\xbfP]\x0b\xec\xb9\xab\xed\xbfU+}\xd1\xa9\xb8\xc9?\\*A\x8c.$\xe8?w\xae\x91\r\xc5\xa3\xb1\xbf\xa4\xbc\xbf\xfb\x1a\xeb\xe0\xbf\x1c\x07 \xed\x1a\xbf\xce\xbf\x87\xcb\x7f\x9d\x0c\xbd\xcb?r4`2\xfeO\xed?\xdfb\x1c\xf5r\x1f\xe2?50\xfd{\xc6\x19\xf2?dl\x9a%\xda\x02\xca\xbf\x9d\xae\xdc\xb2\x9d\xf1\xdc\xbfv\xb9\x03*\x8a\xe9\xd4\xbf\xbc\x9cFo\xad0\xd0?\xcaw\x05\x97\x982\xe7\xbf\xcek\x8d\xd5\x87G\xac\xbf\'\xc0\xee\x0f\xb8K\xdc?n\x14\xc4p\x18\xfc\xed\xbfL1G^*F\xe2?\n\x06\xfb4,W\xf2?\xe9\xe4\x1c\xcf\x91\x91\xe1?\t\xf8\xe7\xadJ\xb8\xc6\xbfW\xa2Mz\xc8\x92\xf2\xbf\'\xe0\x91\xcb\xcc\xf4\xc8?\xe1\xf3;\x15\x08M\xf2?S\x1e\xb0\x0e}!\xd1?\xb5<\x87\xddh-\xe5\xbf\x0bY\x06\xabBr\xcb\xbf&ME\xea)&\xe5?G\x0cN\xd5\x7f\xef\xf0?s\xdf\x9c\xd7\x87?\xe9\xbf\xcb(\x178\x9d\x08\xf0\xbf\xab\x11\xbfE\'\x90\xdd?\x92\xd5Cv\xaa\xa4\xdc\xbf\x05\x1bGS\xf8\x13\xf0\xbf\x91u\xd7\xdbDN\xd9?\x15[\x84\x90\xb3\xa8\xea\xbfo\xd9\xdcnx\x14\xe6?\x86k\x87\x04\x81\xb5\xc7\xbfO\xef\x14\x14\xc4\xce\xb2\xbf\xa7U\x9a\x03;\x0f\xe4?\xe4\x0c\xb6>LM\xd9?\xbb\xc8\xdfxX\x99\xe6\xbf\xbc}\x8e\x0cZ\x99\xe7\xbf\xb8P(u]y\xd4?C\xb6&X1\x19\xdc\xbfT\'vn\x8e\xfc\xfc\xbf\x12+\xdeC2\x91\xfa\xbf\xa0!\x80\x01\xce\xb5\xd3\xbfB\x82\xcc8\xa4j\xc2?\xc8\xba\xa4\nl\xc8\xb1\xbfn\xe74\xe5h\xcb\xe7\xbf\xea\xdcV\xa6l+\xb8\xbfP\xc9\x0e\xccnh\xc8?@/\xf6)B\x0f\xe1?\x93\xac\xa5\x98dj\xf4\xbf\x13\xfe\xfaJ6\x08\xde?\xe1N2\xe8\x84\xa8\xbc?\xc8[u\x94\xf8\x02\xe2?1\x9f5\x87t5\xe3\xbf\x00U~\xd3PD\xd3\xbf\xb8\r\xe8\x86dB\xb0?7<\xadhq\x89\xe1?\x97\xf0\xbd9\xd8\x98\xe4\xbf\xd7\xa1;\x84\x94P\xe2?/\xc6\x96\x8b\xe3\x1e\xd3\xbf\xd0G\xf1j\xf9\xef\xef?#\x99A5\xfb5\xf0\xbfPk\xe3\x07{\xbc\xde?\xbc\x12\xd5\x7f\xbe\xc6\xd1\xbf\xe11\xffb\xbb\xdb\xde?|\xde\x9a]w\x1f\xd2\xbf\x9d\x0e\xe5c\x01\xcb\xd2?\xc9\xf9\xe5\xb1\x8d\xf1\xdb\xbf\x8b\xda\x11\x17@\xb7\xd6?\x849a\xd2\x8cT\xe7?\x9e\xd9\xcc\x8ac\x07\xef\xbf\xa5sIz\x16K\xeb?\xfc\xb2(\x81S\xd5\xf5\xbf\x9a\xeb\xc6\x83N\x1d\xb9\xbfyZ\x99\x14\x0bB\xe5?\x1b\xcbin\x11R\xd8?\xbc\t\xbd\xb6\xb2R\xf4\xbfh\xef\xe1BQ2\xca?\xbf\x18\x1cH-F\xf5?\x92\x80\x95\x7f\x82[\xb8\xbf\xf5\xd4[G\xdc\x8c\x87\xbf"\x01\xf9:\x06|\xdd\xbf\xab\x08\xbf\x84DN\xf1\xbf\x96f\xe8\x1f\xd0\x1b\xdd\xbf6\x9aD\xb9\xd1\x8e\xe0?\xe61`\x1b~\xc2\xe1?\x10-F\xaaBk\xe6\xbf\x9d\xc1\xf6\xbc \xbe\xb9?$vk\xc1\xed\x0e\xe6?\xfa\x06\x08W*\xf7\xda\xbfF>G_{M\xe8?p(\x9fS\xb3\x92\xe8\xbf\xf4\xdf\x88W]\xb1\xe1\xbfP\xd5\xaeZ\xb0J\xdb\xbf$\xe3\xb8\x06\xb0\t\xe5?\x00A\x1c#\xfcw\xe0\xbf\xc2\xf7\x1ahm\x04\xc8?\xa1\x02\xee\x1c&\xfe\xed\xbf\x82\x04J3\xb0\xa2\xb6\xbf}\xa2\x99{\xb7\x97\xe3\xbfr&\xf4\xa8\xaf|\xdc?\xafj\xb6\x00\xe3p\xf7\xbf\xdb\x03\xe4j`{\xb3\xbf\xbe!\xe3\x84hR\x00\xc0\t\xa9\x02(\x8f\xdd\xe3\xbfE\xcd\x18\x8dw\x90\x02\xc0\xbc:W\x8a3\xbb\xf8\xbf\xae\xcf]\xa8\xbb\x87\xee\xbf\x00J\xe2\x1e\xac\xa3\xfd\xbf0g,\xa4%k\xeb\xbf\xaa[\xa5\xf7*\xfd\xf2\xbf\xe2\xb6\xa1\x14\x9f9\xc6\xbfK`\xb6k8\x98\x00\xc0\xbeM\xdc-\xbd\xa5\xef\xbf\xd7\x05\xbe\xf6\xb4T\xa3\xbf\xd1j\xcf,i\xe0\xe2?=\x7f\x06\xb4\x8a\x8d\xca?\xd79\xa8\xd9\xefX\x95\xbfr"\xcd\xc7\xcd\x13\xe8?w\xa4\xc1\\\x8b\xf9\xf1?\x15_\xcczc\x9d\xbd?\t3\x99z)\xc9\xee?\xfc\x8f\xc6\x85<\x9d\xdb?\x1c\xc29>\xd2e\x97\xbf\xef\xf9\xff\xad\x9b\xb1\xf8\xbf\x82O\xd6\x08\x90v\xee\xbf\xd5\xc6fK\x9fg\xd1?\xb5\xd3\xaaP\x90\x08\xd2\xbfI\xd8\xe0!\x8a\xb9\xde?\xfc\xc5*,\xaf<\xc9\xbflOV}%\xbe\xf7\xbf>\xe3\xa0\xe8\xf4*\r\xc0?\xbd\x808U\x87\x0e\xc0X\xde~\xaeYu\x1e\xc0?\xa4\x9b\xbd\x1a\x13\x1d\xc0\xb0"\xf4s\x07\xf5\x1f\xc0\t\xc4\x93&\xa3e\x1a\xc0\x12\x8bR\'\t\x04"\xc0PK\x9d&(\xa7\x19\xc0\x151g\x04\xd4\xc3\x18\xc0\xdf\xcd\x85N\xff[\r\xc0\xb5\xa9\x7f\x18\xf3J\xfe\xbf\xe2\x1dL\x93po\xff\xbf\xcc\x95MO{\xef\xe6?\xc6\xe6\xcc\xd3\xf37\xf7\xbf\x88\x04\x05\xdd"\'\xf8\xbf\xaa\xe8\xb88\xaco\xd2?bW\xb5\xd0\xf0\xf6\xc9?\x03\xc4\x03\xa6@\xc3\xda?\x15dhHTA\xf1?\xc7\xa8\xbbZ\xae\x12\xd1\xbfO\x92\xf3K\xdc\xff\x9a?\xc6\x97\xfa\rd\xa7\xd2?\xa0\xf2\xa1\xd3\x00\x94\x8a?\xc2\x87\xd2\xf0\x12\'\xf9\xbf|\xcds\xeb\xc0\xbb\xe6\xbf\xacXK\xf0U\xea\xb8?\xb3\xea\x9e\xa2\x9b\xbe\x08\xc0\xc1\xa9y:?\x11\r\xc0\x96y\x9c\x97p\x1d\x03\xc0\x95\xbe\\\xbbq\xbd\xc6?C\x8e \xbe\xd2Z\xab\xbfI\xeaT3}\xdd\x10\xc0\xa16>T\xbe;\xd4?\x95\xa5\xc2e\xc4r\xe3\xbfe\x95\xea\xbaw\xf6\xc6?\xed\xdf\x02u\x85\x16\xd0\xbft\x15\x13\x18=K\xd7\xbf\xd6\x87)\xb7\xfah\xf6\xbf\xd0\xea\xc5I\xe1J\xf8\xbf\xc1\x9c\xf2\xfe0\x10\xff\xbf\x0cF\x94\xe51z\xd3\xbf\xcd\x90\x11d7D\xd0\xbf2\xea\xe8\xfd\xde\x07\xff?\xce\x91\x99to\xb7\xa0\xbf\xac\x94\xc6\xa9\xcf0\xeb\xbf\x96\xd5\x97\xd8\x13\x9c\xd9?\xcff\xc2\xc8\xc3\x19\xdc\xbf\r\xa7\x87\xcd\x88\xa5\xa9?\x03\x0e\x06\x849&\xd0\xbf\xcce\xcbm\xd6\xa7\xf1\xbf\xcd\x82\xd3\x8f\xca\xfb\xd7?\x95_\xcd\x06?\xce\t\xc0\xcf\xe6Hm\xb7D\xf7\xbf\xda\xac\xe0\xfaT9\x01\xc0l\x97!\xdf\xb9\xff\xf7\xbf\xff\xf4\x0c\x0b\x08\x1d\xcd?\x17gv\xd3\xc8\xa7\xf7\xbf\xfc\xc9\x0c5\x8a\x80\xdc?\x9a\xab\x8eJ+/\xf3?}R\x81\x104\x91\xe4\xbf\x90\xe5\xafVw1\xdf\xbfq\xdd\xa6\x90:F\xa9\xbf\x00\xa6f\xc6l\xfe\xd7?\x02\xdaD\xd0\xd2\x84\xd4\xbf\x86\xadL\xf4\x1e\r\xe8?\xc2\r\xed7u\xe2\xdb\xbf\xfa\xcd_ \xb2\xf7\xfa?\xe3*\xb3\x87\xb0 \xf0?Z\x00s\xaa\xe6+\x00@\xad\x16\xea\xda_\xd7\xcc?o.p\xa3a\x8a\xd9\xbfJ\x02>\xedoY\xe2?z}\x1b\xa1>}\xef?h\xd8\xb3o\xc8\xde\xe4?\xddY\xa2\x8c\x0b\x9d\xe7?rLLl\xcd)\xa8\xbfh\xf8>\x07\xb9\xae\xd3?_\x07\xb6\xc1\x10j\xea\xbf\xf9t\xa7\xdc\xa6\xa1\xf3\xbf(\x80qoU\x95\xf7\xbf\x95b%\xe5\x0b(\x05\xc0_<\xc8\xe2\x11\x03\xc9?\xfd\xbd\xfc&\xcc\x98\xf0\xbf~\x9d\xcbB\x9e\x02\x00\xc0\x9e\xf8gwR\xba\xd7?\x8b\xbc\x89\xf6\x01\x8b\xdb\xbf2\x1e\xb3 \xef\xa5\xe4\xbf&pry\x1b\x00\xc6\xbf\xb9)\xe9N)k\xec\xbf\x1eN}\x0c\xd5\xa9\xe8?\xdab{\x01E\x83\xd1?\n\xfd\x96\x15J[\xf1?K\xd6\x84\xa4C\xaf\xf5\xbfI^\xc2Xh\xf3\xfa?/\xb2\xe37L\x87\xdc?\x87X\xdf#\x18L\xdb?\xf7\xee\x18\xbc\xc89\xe6?Gw\xde%\x7f\xe8\xf9?\x1df\xdcI\xdc\x90\xee?\x8f\xba\xdb\xb0\x00\xe8\xd7\xbf\xc6\xdf\x92\xbc\x16\xa9\xe5?W\xbfb\xfb\x1c\x83\xa8?\xb0\xf7J\x8d\xae\xb5\xb8?\x1dEp\x9a~\xfa\xbe?Cw\x85~\xfd\xa5\xc5\xbf\x9f\'\xa41p%\xba\xbfe\xa0\x1cf9\x11\x00\xc06\xba\x06\xf1\x96\xe6\xff\xbf\x8e\xae\xf1\\\xc8\x8b\x07\xc0\xca\x98+mCe\x03\xc0\xd5\xe4N\no\xf2\xf2?\xee\x0e\x8b\xd3S}\xb2?s\x02z\xaa\x02\r\xe8\xbfx\x85\xd4q\xad\xa2\xf5\xbf\x9e\xaba\xcf\xce\xce\xf0?\x03\x84y\x96\x98P\xfb\xbf\xfe\xa1\x05\xdbP\x8f\xf6\xbf\xfa\xda3\xeajn\xcf\xbf\x8d\xc20\x9d\xacg\xed\xbf\xae\x1c\xa3\x92\x83\x02\xd8?\xad!\xf1Ja\xa9\xe5\xbf\x9c\xf8\xef\xc2_\xc0\xf2?\'\xceC\xb2\x87\xf8\xce\xbf\xd5\xc5\xf2\xc0W\xf7\xf7?\x99\xddS\x1d\x83\xb9\xf7?\xa5P^\t\x1f\xcf\xed?^\xdf\xa4\x1c\xb1\xd1\xf9?\\\x05\x19\xf4\x07\xa0\xe8?K\xcf\xb2k\xf8\x87\xdd\xbf\x9bFZ\xe9\xb4\xfe\xf5?\x10\x9a]\x89%\xf4\xe1?\xde\x05.\xb1p\xf9\xf1\xbf\x85z\x91\x85O\xcc\xd5\xbf!\xc1f\x82\xaa\x87\xfb\xbf\x0c\xa1+\x1e\x00\x0e\x05\xc0h\xe0\x17Q\xa8\xa0\xfb\xbf\x86\x1e%\x81\x81\x91\xe5?d\x8e\xde\xfb\xdc\x99\xf6\xbf\xa4\x08\xfaX\x8a\xe0\x91?\xa5\xf6\xb7\xd3\xc6S\xf4\xbf\x03\xdbe?Db\xe8?\x0cW\xf4(\xe8(\xcf\xbf0\x9a-B\xad\x01\xdb\xbf>\xd3I\xd4\xaf\xd5\xef\xbf\xddE\xf1\xd9/4\xef\xbf\xdd\x9bIIy\xa3\xab\xbf\xc6\xcd\xecK\xdbs\xcf?\xf1\x16\x84{\x91\x99\xe1\xbf\xb7\xf4vr;\x98\xff?C\xee\xd2x\xccL\xa9\xbf^\xff\x06\xbb\xdd\xb2\xd6?j\xe2&\x8e\xeb%\xdb\xbf\x82\xe9J\xba\x9b\t\xdd\xbf\x89\x0b\xec\xcd:G\x08@SS6\xdd/\xc8\x10@\x8f\xa1m\xaa\x90\xb6\r@\x10kbJ8m\xf5?\x936\xa6\x02\x07\xd9\xe3?\xa0\x1f\x9b\xee\x91\xfa\xdc?lH\\\x17\xcd\x08\xf0\xbf^\x84\xe4H0\xfa\xdc\xbf\xa0b\x19\xdd\x88G\x02\xc0\x18(\xe3\xb5\xdd\x18\x0f\xc05@\xbe\xfax\xd4\xe1?\x87\\C\xfa\xb1\xfa\xd4\xbfx;\xde\xf4\x17\xd8\xed\xbf\x87n\x8bF-_\xb7?\xc0\x9a\x1d\x94\x9fL\xc2\xbf\x82\x81o\xb3\x90\xdd\xfd\xbf2\xc0\xcdol\x8d\xf3?\xf2\xee\x1a9^\x01\xe4?\xb9q+\x0cg\x85\xe7?\xe8\x1d\xdb\x0c\xbf\xfd\x0c\xc0\x96\x89\x15\x14\xe7\x95\n\xc0s\xcc\xb5\x1e[\xd5\xe3\xbf\xc2E\x9c\x904\x91\xc0?\xce^d\x10\xe9\xc4\xfc\xbf\xb5z\x10d\xf7\x10\xf4\xbf\xb0\xdb\xef\xdc\xcei\xf2?n\x91\xb6\xbb\xf0\xd2\xed\xbf\x8e\xb1m\xb3t\xb2\xe5?6\xd3\xdd\xb5\xefu\x04@\xb3,w\xcd\x98P\x05@n<\xbbR\x06\xc9\x11@{5\xc2\xe6\xef\xf6\xf5?\x9bp\xb0~F\xec\xec\xbf\x1d\x07\xbbR\xa3g\xbb?\x03C\xc2\xc1\x82\xb8\xd4\xbfD5H=\x06e\xf1\xbfx\xf7\x85\xa3\xc6\xc6\xed\xbf\x17>wuB\x94\xb9\xbf\x90h\xaa\x95\xa8\xb7\xe9\xbf6\xb4\x92W\x07*\xc3\xbf\x1f\xd1\xb0|`A\x03@Y\x85\xa6\xd4\x12\xa1\xd4?N\x9a\xa1\xf5\x00h\x10@\x87\x93d\xda\x00\xf4\x13@W\x90_U^\x8e\x0b@\xae(\xb6\x1f\xa0\xf5\r@\x8d\xb4\x95\xe4\x00\x8a\x05@%\xbfyI<\x8a\x06@\xad\xe6U\xa5\x14\xa0\xfa\xbf\xa6\x18NL&0\x04\xc07\xe9\x16/\x08\xf7\x04\xc0\x81\xd5\xc4K\xc7\x1b\xee?s\x05\xbd\xddR\xd3\xee\xbf\x19\x1c?\x0e/\xed\xf6\xbf\x11\x8a\x8c\x16\xa3\xa5\x01@\xcdK\xdd_\x87\xf8\xef\xbf4\xc36\x85\xbc\x0f\xec\xbf\x80e\xddq\x95\xea\x08@L\x18\xad\xfc\xa8\xf6\x11@\xf7\x17.\xf2\xbd\xa7\x03@\xed\x9c\xa9\x90\x89\xef\xbe?\x90\x08\x12&k\xff\xde\xbfO\x91qU\x1b\xb1\xe0\xbfc:o\xb1$\xa5\xf6\xbf\xa2i\x17S,\xc5\xf1\xbfD\xe9\xba\xd1]\xb2\x05@(\xaa}i\xd7\xe1\x0e@;x\x1e\x9c\xcd\xcc\x15@\xb9\xe1\x16\xe9\x9e\xf7\x1a@\xbf49-\xdd\xca\x1f@\x8a\xf1kV\x9c\xc2\r@QQ\xe0\xc6"\x1d\xfd?\xe0\xea\xcf\xe8\xd4S\x03@[\r\xc4\xfb`\xd6\xf6?{\xd7\x0e*\x84\x1d\xfd?\xe5\xddO\xd5\xb2`\xf8?h\xa4\x97rM\xe5\xd1?\xb4\xec\xfe\xd35\xd4\xfa?\xae\x93\xc1\x9b\x06\xf7\xfc\xbfE\xcf\x99k\xabDJ\xbf\x1b\xa0|\xf69@\xc8\xbf\x97\x8b\xff\xda\xf1l\x08\xc0I\x84\x087\x915\xfa\xbf\x1d,n8\nZ\xec\xbf\xde\x16+\xf4\xc3\xc1\x08\xc0J\x1c\xa09\x01\x1b\x07@\xee\xf0\x89-w\x06\x15@\x0b\\\xef!\xf6\x0b\x03@<&\x0e9\xbe\xea\xdb?\xa8F\xecl2\xa9\xe0?\x1fVU\xc3\xaf\xfe\xd3\xbf\xbd-\'\xaa\xdf\xa8\xd7?\xe0\xa5\x0c\xc2Ih\xd0\xbf\xaft\x90\x05td\x17@\xd4r\xff\x84y\xdc\x17@\x10D\xf8\xb0X\xa6\x15@\xee]\xab\x12\n|\x12@\xe3\xa6t\xea\x1b\xaa\xee?\xe9\xad\x01\x1eH\xd3\xf9?\x8e\xdaF\xd4\xdf\xef\xf7?9\xc4\t\xbb\xf01\xd2?D\xa1\xf6\t\xcb\xc1\xf6\xbf\x92{\x171\x84t\xf4?\x0cI\x9e\xf8\xe6`\xe6?\x03\x11\xf57\x8c=\xfb?9n\xf2s\xa9\x86\xf1\xbf\x80O!]\x90F\xef?\xe5\x1c\xc7{\xbf\x0b\xc9\xbfq\x91\xd7_\xaf;\x05@\x9fL\xb3F^b\xe7\xbfl\x99\xabfP\x1b\xf6?\x07\xe2`j\xf9\x19\x0c\xc0x\x0eE1\x0b&\r\xc0\x87W\xad\xd6"\xd2\x00\xc0\x93Ii\xfd\xcac\xf7?\x19\xd8\x0e\x84@\xbd\xfe?\x88\xef\xdb\x7f\xb7\xa2\xd5\xbf\xee\xe6\xa6\x1b\xfdO\xe6?\xd2/\xf3\xab2\x8f\xe9\xbf\xdfR\xd6\xcdn\xa3\xf5?\x010\xdcXSk\xb0?\x0b\xcf\xf48"q\x0f@\x89\xb3\xacg>c\x06@1\xaa\x819\x1f"\xe2\xbf\xc5$\xa2\xc6)\xc1\xb2\xbfq\xcc8\x7f\n0\xf6\xbf\x89\xcd{\xb1\xe1<\xac\xbfs\x10\x94l]\xd3\xd3?%\r\'\xdd\xda\x0e\xd7?\xcc\xd8\x80iSR\xf9?n\xa9\'\xf04\xeb\xe4?\xb3(\x95\xd0l\xff\xc8?\'$\xd0_\xddu\xfc?t\x03l&\xddk\xeb?\x1aa\x8f\x01\xc9\x01\xe6?_{@\xf9s\xde\xe4?\xfa\r\xcf\x07\xb8\x15\xfa?[\xb9b\x85\x06q\xf0?rz%}I%\xf0\xbf\xd2^\x95(1\xcb\xe6\xbf+1lT\xdea\x0b\xc0$\xb1;I\xb80\x10\xc0\x1a\x8e\xf7J[\xbc\xf2?rW\xd6\x04\xc40\xeb?Vzo\xd0\x17Q\xf6?\xbb\xc6\xe6\xbc\xf3\x96\xeb?\x9b\x88Z\xff\xb6w\xc0?\x13\x8c\x1cM8\x15\xe0?\x158\xf0\xfc\xc1C\xf9?\xfd\xb3F\xd0\x9f\xb1\xf0?\x8d\xd6Ph\xfco\x05\xc0J\x0b\xf6\x9b\xc5s\xe8\xbf\x86\x15JV#>\x04\xc0#\xa1%\xd3\x00o\xa1? \xd6\xe6\x89\xe6\xab\xe6\xbf,7\x94\x151\x12\xe4\xbf@\xf8x\xae\xe0F\xf8\xbf\x031\xce\xe5\xe7\n\xef?w\xb0\xe1\xbc\xb7B\xf8?Y\x0b\x96\x87\x1a%\xe6\xbf\tK~\xef\xed\xdc\xfd??\xb1t:\x05K\xf2?\xdak\xe6x\xcb\xae\xda?\x93\x01\x000\xd4y\xc5?51\xd8\xc0~\x9b\xcc\xbf\xb8\x18\x80(\x97\xba\xe5\xbf\xa2u\x89J\xdb\xed\xe1\xbfb\xb3\x1b\x8b\x9as\xd8\xbfs\xaby\xbd\xa0}\x01\xc0:\xe4(q\xea|\xcf?\x96FI\x91\xc0P\xe7?;H\xb6\x15\xcd)\xf0\xbf\xa1\xc7ei\x86\xda\xf9\xbf\xd0a>W\xa2W\xf4\xbf\x86=\x7fb>?\xe5\xbf\xc2@B9\x03A\xee\xbfwP<[f\xc3\xee\xbf\xf5\x10x\x06\x9f\xd8\xf8\xbf\x0b\x15\xfa\x9e\xfe\xaa\n\xc0\xdc\xa4\'\x1ev\xa5\x0b\xc0G\x17g\xaf\x07"\xea\xbf\xd6\x12!`\x9f\x1f\xe9?\x83\xa7P\x9b\x00\xb2\xb5\xbf\x11\x8a\xac\x82\x92\x83\xea?C\xc8\x03\xb7jx\xe2?\x8b\xe1t&\xf7\x1b\xf6?\xd3J\x01\x15\xb3x\xe8\xbf\x03u\x0eC\xd5\x8a\x04@&}G\'\xc4l\xc6\xbfS\xad\xc5\xee\t_\xf4?&NoP\xe2\xb0\xed\xbf\xa6\xb1cw\xc3\xa0\xc6?(.\xcf\x15On\xba?\xf2\x0c\x04\x98\x99\x93\xe6\xbf=\x93\xbbt\x1d\xd6\xfb\xbfZ\xc0sw\x05\xa7\x03\xc0\xd3\x14\x15YJ\x07\xfe\xbf\xb4\xa3\xda1`\x14\xc2?\xd7[\xa6\x8f\xb2\xca\xbd?lM\x7f\xf2\xa6\x19\xe5?McA\xa8\xe0\xeb\xe4?\xd9\xf1J\xe4\x11\\\xdf?P\x82\xe7\x8d\x8b\x7f\xd3?=\x8aR\xf5\xd5\xe3\xee\xbf\xb9\x03$\xb9\xc41\x00@*\xcf\xc0o\xbd\x96\xfa\xbf\xbc\xa8G\xd6\xd7\xb7\x01\xc0\x18\xe8\xe3F\x14\xc9\xd9?\xcfN\x97k\xf5\x7f\x00\xc0G\x1c\xfc\xc7(\xa4\xb0\xbf\x06\x1a\x06\x85C\xf1\x04\xc0\xac6\xc2\x9d\x8bG\xff\xbf\x1dL\x10\xb6H_\xd7\xbf\x84f\xf1P\xe6\xfc\xc6?\xdfu~\x98\x14\x11\xd0?\xed\xbe\xefPV1\xcd?\xf7\xffa\x17\xa36\xf8?\xcc\xc8\xa2\xe4\x11\xdb\xe2?\xac\x0b\x1b\xe8S\x8e\xa4?\x82 /\xd8\x10X\xc2\xbf\x11Z\xab\xb4^\x10\xfe\xbf\x93\xce\x18\xce\x91r\x03\xc0\xc8D|\x85\x93\xe1\xec?:\xaex=\xa1<\x00\xc0\xce\x07\x94\x16DS\xf9?\x95\x92\xe6\x07\x92p\x01@f\xf2\x97\x8a\xe8!\xee?`\xec\\\x8d\x0c9\xef\xbf\xb5\x02\xe9c,D\xd1?\x02\xf4h\x82,\xe4\xd4?\x02\x05~\xa5)\x14\xf4\xbf\x10<\xb1\x8c\t\xef\x00\xc04k\x9d7vt\xe5?\x98%\x01\t9\xd8\xfb?\x0fL\xe7\xfb"\x9e\xf2?\x96\xc0\xe4\xad=\xcd\xf8?D\xed\x86\xab\xff\xa5\xe5\xbfJ\xcb1U\xd7\x9a\x05\xc0\xf4\x81\xd9_^n\x08@F\x86\x1b\xe2\xc5\xed\xe9\xbf\xbc`\xbd\x95\x94\x18\xf0?\xcb\xd0\xbb\x81\x05\x87\xf2?\x0b\xb4~\xb1\xc1\x0f\xf8?Y#\xe0\xd4n\xdf\xc2?\x01\xc5Z\xb1M\x08\x04@\x01\xe2P\x14-\xd0\xeb?\x1fH$>,\xa0\xd5\xbfSyM-8\xa4\xf9\xbf\xa4x\xd8\xcf\xc8;\xcc?\xb5\xb51]Kn\xe1\xbfi\x8e\x8dI\xae\r\xf4\xbf|\xeb\xb8Ny%\xfd\xbf\xc2\x14\x92\xd0|\x12\xfb?5|\xbf\x95X\xb5\xec?\x07\xb8i\xc6\x94\xb4\xf0\xbfBI\xcc\xfc\x85?\xe5?\xb2\x9bXs\xbd\xe8\xb0?\x90i\xc3qn\xfc\xe0\xbf\xb3\x95\x03\xde\x1c\x0b\xc4?\xeb\xeb\x9d?\xda\xb3\xd8\xbfM\x18\xb9M\xfc\xfa\xf8\xbf\xb8\xa5\xe9\xc9\x86\xd2\xd0\xbf:\xa3\x129\xf5\x8f\xf8\xbf\x03\x80W\xba\x83\n\xf8?\x06\x99\xca1\xa8\x9a\xd2\xbf\xfa\xbf\xdf\x1d.\x10\xf1\xbf\n!A\x1a\x01\xa1\xdd\xbf\x89G\xe4\xf6\x0c3\xe9\xbfb\x03\x94\x15\x08\x93\xfa?\xbd\xd6O\x18\xe3\xec\xd4\xbf\xd0{k\x10\xc1\xb6\xe1\xbfQ\xd1\xd1\xd5\x9a\xb5\x06@E\xe0\x8aF\xd7E\x07\xc0\xa7\x8d\xb7.\xb2\xd3\xf6\xbf\x1fKTy\xd9\x99\xfd\xbfD\xf0N\x12\xbfA\xf4\xbfv\xff\x13 c\x0c\xfe\xbf\xa1r\x0b\x8e\xa7T\xe0?\x87\xc6]\x12\x93A\x07\xc0\xebS\x08\x97O\xe7\xf1\xbf9\x8bD\xea\xd9\xe4\xe2\xbfv0t\xa0J\xcb\xe6?\r\xa5"k\'\xe6\xf0\xbf\x07\x8d\x99\xc5C\xa8\xc9?1\xec~\xb6\x7f\x9d\xac\xbfp\xde\xe2\xc5\xce0\xd6?\x02Y\xd3#yQ\x88?\x05\xb9\xde\xb8e\x8b\xe5?))\x81i\xce\xc4\x05\xc0:\xd0\xadx\xe9\x1b\xd9\xbf\xeb\xf3e\x05\x7f\xc1\xe7\xbf\xd5i\x00\xa0\x1b\xfc\xda\xbf\x17\x070t;0\xc1?9U/\x18\x1c\xe4\xe8?XlF@\xf5\x1bD?\xf8\x96\xddM\xdb\x98\xdd?\xad\xb5\xa4\rp\xab\xf7\xbf\xd5=\x9d\x9aVX\xf2\xbfo\xcb\xfaG\xe8\'\xec\xbf\x96\xb8\x84\x8fo:\xf4\xbf\xe0\xba\xae\x07c\xb1\xfa\xbfxG\xcb\xb4Q_\xd5\xbf\xd2\x94c\xa0\xc3\xa2\x05\xc0\xab\xa3j\tN\x17\xf0\xbf,\xf2z\xaf9\x8d\x01\xc0D\xe4Ss\xdf\xe2\xfe\xbf\xda\xaf\xebM\x1b\x86\xe7\xbf\x99\xbd\xaf\xca\xf32\xde?\xd8 \xe3VPg\xf5\xbf\xb8\\\xdd\x8b\xf7_\xec\xbf\x19\xe0NF\xe6\x9c\xe1\xbf\xd8m\x0b(\xa1\xb1\xe1?\xa4#T2l\xf0\xf2\xbf\x1a\x91\xe3\x8e\xed5\xbf\xbf\xb3\x85\xa6\xec\xec\x9d\xc9?u\xa7?l^Y\xe2\xbfQ\x945\x16(H\xec\xbfT\xc9\x0er\x97"\x01\xc0\xfa\xa3\xe9\xb1\xf1\x88\xf9?\x06sd\x19\xae\xc8\xe0?\x93\xa8\xe6b}<\xd0\xbf\x8eF$XX\xb5\xf8?\xb8\xdf\xdf\xe1\xb5[\xf9\xbf\xa7\x0f\xe3\x8e\x87\xa0\x00\xc0\xa3\x9f\x10\xc1ax\xb8\xbf\\\x13\xb4{\xcfc\x04\xc0\xa0c{f\xce\xce\xd3?\x1fz\xa7\x14\xbeY\xf7\xbfa\xe8m\xef4c\xc0\xbfo\xbe\x9f\x83,\x8d\xba\xbf\xec\xe5\x87\xdbt\xd0\xe2?\x8d$L\x98\xe5B\xe7\xbf\x04C\t\x8e\xec\x1d\xd2\xbf\xb4&?3\xdd\xd8\xe9\xbf]\xeb\x89\x90O+\xf0\xbf\x92E\x98I\x15\xa6\xe7?\xc3FB\xc5\xce\xef\xf0\xbfV\xbeT\xb17\xb7\xe5\xbf\x91\xccF\xf8\x1a!\xc7?\xae\xc6TKDG\xe0\xbfZ\x00\xe8xF\xc3\xe2?\xe7\xa1m\x01\x82\xfe\xdc\xbf\x9b\xbcOn\xc0"\xe3?7\xceA\xd8\x815\xd0\xbfpt\x99\xdcG\xd3\x01\xc0|yZ\xa1\xf0\x84\xe9\xbf6%\xcdg\xb9\x9a\xa4\xbf\x19\xb9\x0bd\x92}\xec\xbf!\xf1\x98:\xb0\xa0\xf3\xbf\x93e\xbc[\xab!\xf9\xbf\xc2#\x0e6\x98S\xaf?\x92\xb7\x90\x07\xe3\x12\x07\xc04x\xe8\xb2o\xe9\xdd\xbff\x84\xcf\x1a\x1dn\xee\xbf\xdab*\xb4\xdac\xf1\xbf\x80\x92\xbb\xf3?\xc9\xe7?\x1d\xf5\x99\x00P?\xdc?2\\\xc8\xad\x1b\x86\xed?\xd1\x9a\x02\x14\x195\xc5?\x16>C\xb7F\x0f\xe9\xbf\xa3\xdb\t\x15\x87\x04\xd6\xbf[\xe7\xd4\xae\xfa\xdc\x00@\x13\xd1\xd4\xf2\xcc\x95\x05@"\x12\xc6\xebC\xda\xe6\xbf\xf7}\xb3\xe3\x15\x99\xd2?\x1d<\xdf]\x919\xe2\xbf\x10\xfeU]\x9c\xc3\xf1\xbf\xfb\x85\xc6q\x883\xe9\xbf8\xb2\xfb\xad6>\xea\xbft\xa5\xa7j\xa6<\x94\xbf\xdb~\x979B\xe9\xed?\xacg\x83\x91\x043\xa7?bN\x06\xf9n\xc1\xe6?\xbbu\x15\x93\x92\x1c\x00\xc0\xf3\xf0s\x94\xc4P\x81\xbf\xda\xcam\xa9K\xc5\xc1\xbf\xec\x9a\xcb\xc6\xd7E\xe0\xbf\xa3\'p\x0eDA\xe0?\x95\xe3\t\x1f\n\\\xce?\xfes\xfb\xe6\x99a\xf4?2^ZFw\x0c\xf0?\xd2\x17\xce\xe0\x9fsu?\x8b\x0e:\xd5=\x04\xc1?u\xf8\xd7\xeb\x7f\xdc\xd5\xbfM(\x9f\x82\x1f\x1d\x04\xc0\xef\xb3[6\xf5H\xb5\xbfK\xb8\x95k\x12\'\xf8?\x10|;\x1d\tM\x11@5.\xe3U\xc7\xb1\xe0\xbfy\x87\x91]\x0e\xb8\xf7?\x7f/\x97\t=\x97\x0b@v\x95E\xa9\x08O\xc7?\xf4\xc7N&\xfa~\xe8?E\x8e\xfb\x17\xab\xdb\xe3\xbf)\x9a\x967\x84\xe3\xeb\xbf\x81\xc2#p\x0b\x89\xdb?\x84\xado\xa9&\xd7\xf1\xbf\xb5l\xb7s\xca\x8d\xf6?\xe5dV\xa1]\xb8\xc6\xbf^\x96N\xdd\xb8\xb6\xd2?\x01\xfe<\x8e\r\xec\xe0\xbf\xcacd\xfd\xdd\x0e\xf5\xbf\xd4?,\x98\x13K\x04\xc0p\xa5\xb1\x8e\x90\xb2\xf5\xbf~\x90f\xcc\x05\xaa\xf0\xbf\xed\nz\xcc}\xf8\xe0\xbf=nu\xfb&x\x00\xc0Se\xcao\xa7\xd0\xc4?\ts`\x00\xf1\xc3\xf2\xbf\xb2\x95\xdd\x86\x01\x97\xc2\xbf\xb0\xd1@*\x0fp\xc7\xbf\x85\xf9\xd7\\\xb2\xa4\xf3?j\xcc\t\xed=\xb2\xf4\xbf\x88.\x8a\x97\xbc\xec\xae\xbf\x89\xbd\xda\xe3\x8f\xbd\xbd?\xdcy"\x0f\x10\x0b\xf8\xbf\xa7j\x94E\xf4\xc6\xee?\x15*\xf3\xc7\x9d\x9b\xff?\xa3\xaa1\xde\xf3!\x00@\xd8V\xea\xe6\x0c\x9f\xe4?P\x0bdA\xe7\x1e\x00@f\xb2e\x84k\xd6\xea\xbf\xc12\xaf\xd8,\xdc\xe6\xbf\x9dz\x13\xb7.\xa1\xf2?\xac\x1b\x01\x8d\xf1E\xdc\xbfNPG@`*\xb0\xbf{\xf9.\xc8ho\xf0\xbf%\xca\xb2z\xf0\xa6\xf4?\x16\xeb\x9f# (\xd9\xbf\xfb[\xff\xf0\x9e\xdf\xfd\xbf\xe0\r\xc0\xd0w\x07\x01\xc0\xdar\x1cV\xc5T\x00\xc0GQ\x93\xf9\xf1\x1c\xf9\xbf\xa8\xe5V D\xc6\xb8?\xb0\xf8\xac\x8a\x9b\'\xf3?;A\xfe\x94m\x1c\xf7\xbfM\x14YC\xc4\x0b\xf4\xbf\x0c\xa6$\xdc\xb6\xd6\xb6?\xb6N:R\x172\xea\xbf\xe5X\xe2W\xcc\'\xf5\xbf\x1b\xdf\xc2\x16\xc4J\xc4?&\x19D+0\xef\xe8\xbf\xd9\xeci("\xf2\xe4\xbf\x0e\xa0\xe3*\x96\xec\xff?7\x19\xd6\xc9R]\x0e@\xeb\xa7\xbbx\xfdp\xfd?\x8d9\x15O\xd07\xf6?\t\x97x\xa9y\x82\xf0?\xfbM\x083\x8e\x1f\xf1?\xb9\xc2\x96\xfaG\xbe\xee\xbf\x8b\x0e\x82TD\xda\xea\xbfa\x12\t\x99\xc1\xbf\x16\x9d>u\xef\xe5\xcb?\x94\xa0\t\xc6\xcf!\xc9?\xc0_\xd82\xa8R\xf2?\x10\x9a\x14\x90\x16\x82\xf7?\xab\x04\x08\xcd\xbd\xef\x03\xc0\xdf\x96e\xd7\x8e\x01\xc8?Bo\xb9\t\x85\x19\xd9\xbf\x15\xdc\xdf.\xb7\xf3\xc1\xbf\x9a\x9c\xfc\xe9\xe1Y\xf3\xbf\x0f1\x1c\xf6S\xaf\xf1\xbf\xbf\xed\xa1\x9e\xb0\xce\xe7?\x83@\x06\xc6\x0fv\x08\xc0wH9\xf3\xa1\x05\xf1\xbf\xc1\x05\xdc\t\xf1|\x00\xc0\xb4\x14Hy\xa8\xd5\xcb?\xad_\n>s\xf4\xf5\xbf\xdc\xe6\xc6\xa7vz\x01@l\xcb>\xf6\x94\xfa\xd0?|\x8d*\x8c\xc2\x8e\xe6\xbf\x19\xc5\xd7?\xbe.\xe2\xbf|2s\'0\x1c\xc3\xbf\x94\n|W\x8b-\xff\xbf\x1aD_t\x7f\xcf\xee?\x1e\xbf\x9c\x9dr\xc0\xf3?\xf3EW\xb9j.\xf2\xbfL\xd2\xb9Z=\xdf\xcc\xbfX\xf6\xee\xabqH\xf2?M\xb5G\xe4\xe1\xe7\xfb\xbf\x83*\r\xdc\\.\xc4\xbf\xa65\xa9h\xbf\x86\xf5\xbf\x04(\xc8x\xb3\xdb\xf6?\xb4\'*\xcc\x12\xa4\xe8\xbf\x95T\xbdl\xdeE\xe1\xbf/\xb06\x0f\x00\xe6\xe3?J&\r\x85\x97\xd6\xfb\xbf>\r\xcb\xacQ\x04\xdd?\xbfW0N\xaf\xc8\xe2\xbfS\xf2\xf1\xa8\x85\x1a\x04@_\xee\x1d\x12w\xf1\xe7?\xdc\xa9:\x10\x99\xd1\xe7\xbfp\xb4\x92\xafn\xeaY\xbf\x00\xa0\xbf\xddZQ\xe7?\xfe\xde\xfe\xc0I\x96\xbf\xbf"\xae\x0c\xef\xd4B\xef?l7H\xf8\x126\xd4\xbf\x12\xaa\xfa\xafh\x07\xd9\xbf\xc4\xben\xed\x1a-\xf6?\t#\xc6\xc9Fn\xab?\xed!\xf0^\xc4\x18\xe1\xbf \xe3]\xe2\x8bL\xe4\xbf\xfa\x18\x1d\xf8\xd8\xf3\xec?\x0f\xb4\xed\xb1\x88h\xd6?u\xa9\x91\x19\x86\x9e\xda\xbf\xc5)&\xd2<\xe4\xed?,B~\xc0\x05\r\xeb?*\x8bI\xde\xdfc\xe1\xbf\x88\xdc(\x80ES\xfe?/\x13R\xc6\xdf\xfa\xec\xbf\x8d\x01\x9e\xcb\xf8\xa4\xb4?-\x95\x83\xb7e\xc6\xd5?\x84;\xebk\x89N\xcd\xbf\xb1yG\x9bTE\x87\xbf\xe5\xf8<\xf3\xfas\xff?\xf7D\x96\x8b\xf2\xbc\xbf\xbf\xe6\x9f\x8b\xe82\xde\xe5\xbf\x98Mo}\x8aZ\xd1\xbf\xd4\xee\xc3\xbb:s\xc6\xbf}\xf0\x11\xea\xf4\xd6\xec\xbf#\xc5\xf0\x8e \x97\xd9?\x04\xfd\x19>\xa0K\xc2\xbfph\xc0\xbd\xae\xdc\xeb?\xe4o\x9d\x89\xeb\xab\xf2\xbflac\xe6\x06\x84\xc0\xbf\x1c\xb8T\x89\xfd\xed\xfa\xbfg\xc6|N\xa9\t\xd3?\xba\x90\x08\x1f\x9aF\xc1\xbf\xfaFX\x91d\xfe\xe6\xbf\x8b\xbf\x89\xeeH\r\xc4?\x1c\r\xa2\x17\x88l\xed\xbfR\x9dJ\xfc\xf9 \xe7?\x94\x83\xb2\xb3\xaf\x90\xd6\xbf\x8a,\xad\x8d\x10\xcb\xf0\xbfw\x16\xc3\x15\x1d\xdd\xef?,\xedA]\xd3\xd5\xf4?+?\x1c[\xf1\xcd\xf1\xbf\x87H\x14\x0b\x11=\xf4\xbf\x86$\xc4\x84\xac\xb9\xc8?s6\xa5u\xfe\xb8\xf2\xbf_3v\xc8Tp\xc0\xbfU\x85\xe4Yz%\xdf\xbf\xcep\x8aQf(\xe3?\xd2\x92\xf4mQ\xd7\xf2\xbf-!/\xf8<\xde\xd8?x%\x01\x19\xc0~\xed?\x1c\xcf\x84X\xd4\x8e\xf3\xbf}n\x0eq\xe9\xc4\xe3?\'9\x80,\x10*\xc7\xbf\xdd\x8ay\xca\xf1\xed\xdb\xbf\xb6\xfc\x84\x197S\xe4?\xa2\xe2\xff\x96z]\xe1?N\xba\xe0\xf7\xa4\xa4\xd2?O\x87\x03\xb8\xfdF\xdd\xbf\xbd\xf6_\xd2!\xe0\xf0\xbf\x8e\xbb\x8b\x01\xe2\x12\xf1\xbfs\x03\x10+\xfb1\xc1\xbf\nD\xc5\xf5\x11c\xb7?y\x85\xd4/:;\xdb\xbf\x1fYB\x10\xc7\xec\xd9?\x8b\xec\x84Jl\x13\xcb?\xbb\xe3U\x1e/\x94\xf2\xbf\xeb\xf8\xf12!\xd6\xf0\xbfT\xdc\x1c\xa3\xeb\x15\xc1\xbf\xbb\x94\xc99\xa4\x04\xce\xbf\x06\x98\x12\xd2\x08\x90\xd4\xbf\x06\xd3O\x9d\xda9\xe8?H/Y\xd2\xde\xeb\xd4\xbf\xe1\x83#\xd1\xf0\x93\xcf?\xf5\xe6\xdfU\xaf\xe2\xe6\xbf~\xbfK\x9ch8\xd2\xbfz\xc6)\xfa\x96\xe2\xd1\xbfmu\xb8\x8e\x86p\xec\xbfE\xd2X\xe1\'\x9e\xd8?\x8e\xb6\xda\x9c,\xe1\x9d\xbf.\xbc\x81?m\x90\xf9\xbf\xfe\x90\xa2\x9eH\xa4\xe3?L\xb6hJ\x05\x8a\xe7\xbf\x95\xa0\xa1\xe9&\x8d\xf7\xbfy\xd9\n\x07\xeba\xf4\xbf\x83\x85\x91\xc6\x08\xaf\xb5\xbf>\xd8\x96\x86\xf8\xd2\xe9\xbf\x93y\x10\xcc{9\xf2\xbf\xe5\x07E%\xc1\xcd\xec?S\x7f\x04\x8e\xd4\x1b\xd4\xbf\xeb?\x94\xa4\xffe\xea?b5\xde \xab&\xe6\xbf\x18J\x90\'\xb6\x87\xc9?\x99\x0c\xc7my*\xf4\xbf\xc0,\x7f\xabt\x0f\xcc\xbfQ\x1dj\x04\x97\x9f\xd8?\xb6\xa6)\xfc\xf5\xe5\xe5?\xc8\xd10u%\x9a\xc8\xbf\xe7g\xce\xaevI\xd1\xbf3\x9b\xef\x11l\x16\x97\xbf\xd3\xf9aT\xa0\x83\xe7?\x99(\x90v\x01e\xb6\xbf\xd3S\xa2\xcf\\O\xd1?"\xe1\x84\x13\x83l\xf6\xbf\x14\xa8\x11\xe8\x83\x0f\x00\xc0\xa1$y%\xc7$\xd3\xbf\x0fZE\x91s\xcb\xe7\xbfL\x1c\x18k2~\x0e\xc0O\xa2>h\xc9\x14\x0c\xc0\x12\xf0\x99\xc2\xf5\xe9\xcc\xbf\xaa\xb41\xd5\x05I\xf6\xbf\xfe\x1b\xa4J\xd0\xc8\x04\xc0i:D{\xc72\xf1\xbf\rMa\x8eta\xe4\xbf\x96\xa3v\x84U\xd3\xea?\x84=\xc3\xe7\xd3\x1c\xe5?)\xad\x02\n\xc0\x02\xf0\xbf\x9e\xe7\x0f\xf9~c\xf1\xbf\x08\xc8\xfa\x8c\xb7;\xfe\xbf\x8af6yQ\xcf\xf8\xbf$\xb8\xb5K\r@\xc2?f\xcb\x87\x92eO\xdd\xbf\x91_\xca\xb2\xae[\xe2?\x83\x8a\xf8a8\xb2\xcb?\x84\x8a\x11\xa6w\xb0\xec?\xed\x08\x08\x17r\xa6\xcf\xbfT\xe8\x92C\xf1\r\xe6?\xaf\xfa\x0e\xe1\xe5$\xf9?\x8bKS\xae8\x8c\xe3\xbfeL\x84\xe0\xa6$\xe4?@=V\xe4\xe2h`?\xda\xeb\xae\x0b\xf6D\xe8\xbf\x89-\xe7%\xc08\xcb?&Y4E~\x9f\xf1\xbfP-\xcb0\x96\xb6\xd8\xbfso:W\xadM\xc4?e\xfd\xe9\xbb/\xa4\xec\xbf\xaa^\x8f9\xb9\x80\xff?l\xcf8#\x06-\x05@\xafA\xc6\xacL\xd6\xf7?\xf5\xd8\xfa\x95\xf8^\xd9?\xb3?\xba\',\xf8\xfc?;\x94\xde<\x8b\x12\xb5?\xb9\xc7\xfa\xb1\x13@\x00\xc0\xa9\xbbC\xee\xdc\xcb\x00\xc0o=v7\xe3\x98\xf6\xbf\x1fW\xb7q\xd5\xb3\x03\xc0\x0b\xa7GI\x95\x97\xee\xbf\xc5\x9a\x17\xa6\x02\x85\xec\xbf\xa44j\x9b\x90\x10\xdb\xbf\xa1\xbc\xfb\xb7A<\xf4?}\xb0\xeef.\xa9\xc0?\x94)\xfc\x86\xb7\x91\xf2\xbf\x163g\xea\x9f\x1d\xe2\xbf\xba\xd2\x10\xa0\xcfo\xd5?\x7f\xf8\xec]Ad\xd4\xbf\xa4\xcf\xcdpf\xeb\xbf\xbf\x08\xaa\'\x93\x97\x88\xa2\xbfJiD\xa8\x96\x19\xfd?x\xb0\x81.am\xd6\xbf\xdc)\xe3\x0eM\xc7\xd1?\xacb\xddR\x98\xe6\x00@\xa5\x9d\xc0\xf4\x98\xd9\x05@T\xbd\xc3\x9f D\x01@\x8e`u\xdbH\xfb\xf8?\xe79\xa2\xef\x90O\xff?T*\x9c\xf8\xa9\xd0\xe3?\xd1_\xa7bJ\xef\n@\x04\x97\xee]\x14\x9b\xfb?\x16K%\xcfV1\xdf\xbf\x0b\xaa\x19\x17\x17\x00\xd8\xbf\x02\xf8d$\xbb.\xfa?\x82\x12[\x96p\x04\xe6?\xfbh\xc3\xaf\x88\'\xcf\xbf\x95\xd2Wsj\x80\x06\xc0O\xe4x?\xbb\xe7\x05\xc0X%2\x8eYY\t\xc0\xb1\xb2\x7fU\x90G\x02\xc0\x13C\x16\xd41\xb1\xfb?\xca\xe9(\x1cx|\xeb?_\xea\xd4}\x9d\x0c\x88?\xde\xb8\xeci\xc5\xfb\xc4?m\x17O\xd6\xc5V\xea?q\xa3\x7fN~7\xc6\xbfq\xdc__\xe2\x9b\xc1\xbf\xbbo\xbf\xd3\x92g\x03@\xc6M\xf9\xcb\x15k\x12@\xda&;jw\x0b\x0c@\xbc\xe2{<\x86\x0e\x04@\rX\xec\xe6\x14i\x9e?\x86}\x18\rb\x1e\xf2?{\xdb\x0ej\xfbn\x03@\xbd4\x13G~\\\xf7?\xa4j\xc6\x88\xd7P\xdc?\xd8\x04\xcdx\xb3n\xf0?\x9bz\x86P\xb2\x17\xe9?n\xad\xee\xdfh\xa0\xf4?L\xfc\x87\x95\x08!\xfa?B!n\x83\x8cY\xf1\xbf\x9f!A\x92\x8d=\xed?\xa1B\x81\x8c?\x15\xca\xbf\xa3\xf6f\t\xcc\xad\xd8\xbf\x1d\x1d\x97\xee\xa05\xaf\xbf\x8e\x893\xe1?\x07i\xa5\xb2:p\x00@\xb9z\x9cw\x9fw\xfc?c\x1cvrr\x90\xfc?Oz\xebW\xdaj\xff\xbf+?\x9a\x92\xc9\xe8\x00@\x83\xe9\xb7D\x89\xb2\xf4\xbf\xa6\x91\x89\x80\xf7t\xc1?Ox\xd1\x1ea\x01\xef?L\xb2\x1d\x02\xe31\xe9\xbf\xb0\x88\x12\xa7\xdc\xaf\xf7\xbfR\xc39\xa2+\xae\xf2\xbf?]\xb0\xc7\xc0\xc0\x02\xc0\xbe\x91\xb8K\xc3w\xb1\xbf\xb1\xd6n\xd7}\x82\xf6\xbf\xcb\x18UC\xdf\x92\xd7\xbf:\x08\xfbM\xaa\xb4\xd1?\x18=t\xe5\xb0m\xe2?\x01%^\xe7q\xb1\xf9?\xf7\x18j\xe8\xd67\x06@O\xbe.$Sf\xf9?\x02\x1b\xdf\xa7\x1c\xd4\xeb?!\x8a@9|(\xf0\xbf\x99\x89\xb1\x14\xd8#\xe5\xbf\xb3\x1e\xb1\x97\xcc`\xb4?\xd0\xdc\x99\xbe\xed\xb8\xd0\xbfj\xab\xb7S_*\x0c@[\x86r]0\xf6\x00@=\xda]\xf4\xcd\x97\xe6?\xee_\xbd\xe1E]\xc9?\xa8p\x8b~\xe1=\xf7?N7\x100\\v\xb6?(\xfb\xa3`\xe7*\xf3\xbf\xe5|\x10\xeb\x1e\x08\xe7?\xd1\xf7C\xaa\xd5q\xe7?\x1aq\xb1H\xb8C\xe2\xbf-\xc27k\xe9d\xfb\xbf\x7f&\xfc7\x1cX\xe5?\x0e NO\xf0\xe5\x10\xc0\xdd\xdb\xf4\xee\x90\x9b\x18\xc0\xce\xe9\xa6\x8b\xf4\x07\xfc\xbf\x8b\xad\xe5\xc5\xc2\x8e\xc2\xbf\xb6\xeaa@\xc4S\xf2?\x86yA\x13(P\xda\xbf\xf3\xa9\x97\x84\xc3\x13\xff?a\x98\xa7>\xad\x92\xf3?\xaf\xcc\x1ce\xaf^\xc7?]\r\x9c\x83!~\n@\x10:c\x08\xeaW\xf4?z"\xf74\x8f\xc6\xe2?T\xff"\xc4\xadp\xf0?\xff\xd7\x8e\xb0\x1e\x18\xfa\xbf\xa6\xc1,EE\x9d\xdc\xbf\xe2xn\xa9\xfdU\x05\xc0\ng-\x19\xbd\xc0\xeb\xbf\x95\x89y\xc54\x10\x0b@\x94\x0f\x90~,c\x02@\xd8\xa30\xae!9\xf9?\xfd\xebf\xbf\xe0\xea\xf0?\xc8>\x16A,o\xe5\xbfC\ts?\x82d\x02@\x100\xdf+\x8a\xdb\xd4\xbf\xf7\x9a\xce\xec\x86H\xf3?\xbb\x81\xbd5U\xb0\xea?\xf1&\xc0C\x8d\x11\x00@\xca\xdb\xa3\xfc\x07\xc3\xe6?\xdd\xb9\xceo:h\x12\xc0\xc2*\xea;\xa2\xca#\xc0\xb4\xe7\x1aq\x9b\xc7\x04\xc0!,\xaa\xe4\xa9;\xf2\xbf\xb6\x0cW\x92\x1d\xe3\xc0\xbf(\xc9\xd6\x00]\x01\xdc?@r\x93\xb8\xbfA\xd0?,s\x8f0\x84\x96\xe3\xbf\xc5\xdfD\xf2\x90\xa4\xff?\x1a\xc0\xb2/q\xb1\x1d@\r\xdb\xdax\xcb\xc9\x0b@:\xfb\x92\xa7A\xae\xb0?\x83\x94\'V\x93C\xeb?U\x95g|\r7\xcc?\x92\x15\xe0\x98\x03\xf7\xe9\xbfK\xe7B\x00\x8b\x12\xdc\xbf\xd2\xf9\xca//Y\x06\xc0\x9f\xc3\xfe\x11\xa9\x13\xb7\xbf\x0c\xf0\x9b\x85\xee\xaf\xe1?\xde$O\x08\x03\xe8\x11@g\xec\xec-lU\x11@8\xb2\xf0\x8e\xa8>\xbf\xbf\xe6\xd0\x10<\xa4\x8f\x02@\xb9\x92K\x81\xae\xe7\xf5?\x91m^\x8e\x8c\x9a\xf3\xbf\xa0|\xf6\xee\xdc|\xe7?\x07\x02O\x98d\xbf\x00\xc0M\xc1F\xa3\xd2\x00\x06@\x1f\x9a\xc8\x890\xba\x05\xc0\x13\n ~\x136"\xc0g\xfd\xbc\x9b\xa3\xa5\x07\xc0\xbd\xbb9`\xe4\xe6\xc2?\xff\x9a\x0e\x93\x9ac\xf3?\xf6P)\xf9O\xd8\x8c?\x85\x19xL\x88\x83\xcc?\x87>\x94*\xac\x92\xc9?\x86\xca\xbc*2>\xf7?X\n\xe7\x18\x95I\x0c@AB\x82\x9fi\xc4\xf8\xbfX\x9e\x80\xf4\xbfx\x18\xb1\xbe\xef\x10\xe6?R\x86\xffW\xf0\xd8\xe8\xbf\xde\x83aT\xb9\xa2\xe4\xbfUl\xa8\xc8\xd5\xd9\xe9?:\x18n\xf8\xea\xfd\xf1?\xb2\xa1\tP\xf83\xfb\xbf4\xaa/\\\x92/\x14\xc05\x86O\x98M\xec\r\xc0\xf9\x12\xc6\x1eYe\xdd\xbf\x90K\xfd\xe7Y\xed\xe5\xbf\x94=\xdf\xe6\x10\xfe\xe4\xbf-i\x0b\xfe\xe1\xa4\xec\xbf\xc8\xb1\xe38\xad\x1d\x10\xc05\x8cZ30\xd2\x11\xc0\x18\x19\x95\xc3\xff\xdd\x06@\xf1\xac\xa4/9S\xe9?\xbe0\xdfA\xbad\x00@j\x9e\x1f\x8f\xcb\xe5\xd6\xbf\xbc7Y\xe3\xa8\xe1\xe8?\x07\xd4r<\xaa\xf3\xc3?>W\xf2Z\x85\xc3\xd7\xbf"?\x87\x0c\xea\xc5\xec\xbf\xf7\x91\xcc]\xdc\x0e\x0c\xc0W\xd3\xbdl\x9a\x97\x0b\xc0\xdczo\xe5\xec\xd1\xf4\xbf\x16\x96,\xb7\xb40\xf6?\x99|\xb0\xfdl\x01\xd5\xbf\x9e\x0c(\x1aQF\xcb?\xfb\x93\x15\x07\xb9G\xb9?\x10\xcb!\xc8\xf6\xe0\xdc?\xb5\xd3\xff0\xc7v\xe2\xbfw\x7fP\xd4?K\xf1?\x15\rQ\xc1)\xbf\xe6?mS\xed\xf4\'\xa4\x16\xc0\x9f\xddLg\x8b@\x13\xc0\x7f#JR7\x1a\x0f\xc0.\x93}\x9e6N\xca\xbf\xc7:\xba]\xab\\\xf7\xbf\xa6X\xf2\xee:\x92\xdf\xbf\xaddw\xbd\xfaa\x04\xc0\xa3\xa9k\xb5B\xe0\x06\xc0u\xfd\x85\xfa\x8d\x17\xe9\xbfUD\xf1d\xc2=\x02@\xe1\xc8I\xb5\xa0r\xf2?\x18Iuq\x07\x97\xf4?\xc3H\x943c5\xf8?\x96\x03H\xf1\xece\xe7?\xb9YD\xb4\x92\xa4\xd4?\x05=\xd3W\x96\x96\xf2?ME\x1a\n8?\xf2\xbf\xf6\x91[6k\x8b\x0c\xc0\x13\x0c\xfc~U\x04\x0e\xc0\x88\x04W\xc4At\xcc\xbf\xbc(c=\x87\x0c\t@\xf3\t\xba\x80@\xe5\xf7?q\x0e\xee\x8cw\xb2\xea?\xc8\xb5\xd2Wc\xf7\xf0\xbf\xaaj\xc2t\xb9o\xe3?\xa1\x94\xde\x82\xdd\xac\xe6?\xf51/\xe7d-\xfb?\x1c\xa6_\x01=\xb9\xcd?\x1b[|g\xaa\x82\x11\xc0[\xf5\x88\xba\xee\xb1\x13\xc0\xfb\xc5\xac{\xb2x\xe5\xbf\xa4\xe3\x17\x02\xc7\xc5\x08\xc0\xb8V\xa0j\x90\xd8\xf6\xbfb\xe8q\xafA&\x05\xc0c%\x8e\xc1\'\x1a\x08\xc0hI\n\xca\xbd\xf3\xd2?\x0f-P\x08\xa9\x17\xe1\xbf\xcc\xf9\xc4E\x8eE\x03@\x97\x91\xa1\xbc\x9f\x04\xf1\xbf\x9eH\xee,\xcfK\xfb?\xe1$}\xda\xf6\xd9\xe3\xbfOu\xba\x94\x13n\x01@\x8d\xb9WFO.\xdd?p\xd5yY\x95|\xf8\xbf-\xcfm\x85\xc6\xf6\xf1?\x84\xfah\x1a|9\xff\xbf\xc8\x97\xae\xa0N$\t\xc0\x99\xae\x92\x1aW\xce\xe7\xbf\xf3\xc1\x81\xfc*\xb3\xff?\x00\x9b\x81\xf8\xde\xf1\x06@\xd3\xc0Q\x93\xa0\xb1\xe0?~\x07V\xec|\xb3\xd0?P\x9d\xf3*,\xdf\xa9?\x02\xdf\xb2_\xf6\x8b\xe9?G\xed\x92\x80e\x19\n@2\xe5Ie\xa3\xca\x04@\xdd\xe0\xfd\x9b\x04\x15\xfe?\xbez\t\xba\xbe\x93\xe6\xbf\x07Q\xd6\xba\xf1\n\x08\xc0\xed#u>\x19\x82\xd2\xbfo\x9f!mmd\xe9\xbfqy\xc0C\xf4\x8f\xfc\xbf\x98\xb2\x1d\x84>\xf2\xbb\xbf\xee\xa3\x04\x07\x0c\xea\xf8\xbf\xe7\xae>\x92u\x0e\x05@\xe8\xc4\xd8\x89-\xd0\xe1?\xdb\x0cz\x8e\x95\x1a\xf4?,\x84j\xef>\xd0\x11@5\xe1\x91\xd1\x95\x10\x80?%:\xe8\xc0\xc1\x13\xc9\xbf\x80\x1c\xbd$\xe3\xd2\xe4?\xf1\r\x1ac6_\xed\xbf\xe2\x81\xce\x1c/)\xf2\xbf\x12$vs\x1c\x80\xde\xbf\x0fp\x87\xbf;+\xff\xbfd\x16\x8e\xf8\xce9\xc7\xbf\x182in\xc8\xba\x06@}\x85\x80\x16TM\x04@\x94u+@\xe5Z\xf2?\x96\xfc\xa0\x98s\xfc\xfc\xbf#\x8a\xb7\xdb\x01\x05\xe3?w\xba\xec:\xbc(\xe1?\xa4\xb5\xb9\xb0\xcc\x16\xf5?LK\x93\xa6\x95\xa3\x01@%\x8bq\xa7Nq\t@\xd1E\x9by\xa5\x16\x03@\xf7`\xd4\x14\x9b\xea\xe8\xbf\xd2\xc2\x080\xddK\t\xc0x\xf8^\x83\xf3i\xf0?F\xecr\xc0\xce\xa4\xe4?\x0f\xcd1\x80\xbcv\x02\xc0z\x92\xad\x0b\x12\xab\xc1?&\x99\x16\xf6\xe7\xdf\xed?\x1d\x13;\xce\x9e%\x05@I\xdb\x07\x8d\xde!\xf4\xbf3\x0e\x84\xfe\'\x85\x02@\x02\x103Xwb\xc6\xbf\x99\xee\x11m\x10\xd9\xf7?SV\x872\x8f\xfa\xe7\xbf\xc4\xee\xc0\x8fb8\xfa?.B\xe6kW\x9b\xe0?[\x14\x0f\xc2\\\xed\xca?0`\xd8:\xbew\xe7?\x13Fi\xe0\xf1A\xf4?,\x0c\xb0Nd\x88\x11@JP\x14\x92\x15)\x04@\xe7\x91\\\x07\x0c\xec\xda?\xe9\x85\xe4\xbf\xe2\xda\x8b?ex\x83[\xbf\xb3\xd2?zv<\xf0\xbc\x12\xf1?\xe1\x8f4\'\x91\xb2\xfe?WIJX\xd1\x06\xee?\'\x19\x80\xe81\xb2\xe1?\xbb\xb1\xfe\xd62B\xd8\xbf\x15gz\x0b)\x07\xfa?8\xce\x86<\xc5\x87\xc9\xbf\xdaBz\xc7\xdc\xac\x01\xc0\xd8\x98\xad\xddv\xf5\x10\xc03\xa4\tT\xe9\xab\x0c\xc0(O\x91\xc1)\x0e\xec?\xd5\xea\x94\xf4\xf1\x9a\xfc?\xbfT\xceOVK\xe0\xbf\xebl\x8e\xf1$\x98\xcf\xbf[\xd5r\x15V\xa0\xc4\xbfm\xf2\xc5\x11\x8e^\xd6\xbf(\xde.\x96\xb0+\xe3\xbfS\x91\x1e\t\xb7\xa3\xea?\xcf\xe4Z\xcd)\x10\x04\xc0Gi\x19AT;\xe8\xbf\x81\xdeX\x1e\xf9C\xed\xbf\x9cA\x10\x05\xb6\xf4\xd5?91\x9c\xbfP\x19\xd2\xbf\xf9\x933\xcb\x038\x10@\xbd#\xdc\xbfl\xd8\xf8?R\x82GU\x06\xf7\xbd\xbf\xcdp?I\x9cY\xc3?\xee\x99o\x8d\xa6\xe1\xdc\xbf\xf0&\xed\xdd~q\xaf?\xfd\xc2\xa7Q\xdbN\xfd?\x1e\x81>\xb5f\xb9\xf6?C\xa2\xc7\xfb\xf3\xd9\xf2?\xc5q\xce\x9b\x85\t\x00@\x84\xaen*H3\xe2\xbf\x16zG\xc8\x974\xd2\xbf]\x95\xc9\x90\xb5\xe9\xf5\xbf\xd1\xfdR\xbeW*\xb1\xbf\xd5o9\x0e\xae\xf5\xfb\xbf\xa7\xe0\x85\xaeS\xbf\x12\xc0\xdf\xc3d\x9a\x90P\xa5?\x0fu5V\xc3K\x06@\x1e=S\xfc\xf4\x81\xd2?\xa0J\xa2\xf9\xe7\xcb\xc5\xbf\x00\xe3\x02e8\xb4\xf1\xbf\x1a\x053\xc3\xb7\xfe\xe3?#\x1d\xaf\x19\xc3\xfa\xd2?\xe5B\x81&;\xf0\xc3?kJI\xb0\x85\xf5\x00@\xee\xe0~\xac\xc2\xe7\xf6?\xe4hM\x15<\x01\x12@qN\x8a..:\xfd?t:\xb3\x95\xffP\x08@\xeaQ;\x1c\x14\x19\x07@g\\*\xaa\xeb\xb6\xfe?\x00\xe4L\xb7\x10K\xbb\xbf\x8d\xfb\xb1\xb6M\xbd\xf0?|\xae\x9b\xf5\xe1\xf5\xac\xbfU\x03\x95\xa4\x05\xef\xd8?C\xec\x98{\xa3\xcf\xee?Wp\xc1\r\xad@\xe1\xbf?"\xecV\xc3\xfc\r\xc0\x16\x84\x01\xfb\xa0?\xeb?\x86Kw\xcb2\xfc\xfe\xbf]\xa6n\n\x0e\xc2\xf0\xbfug\xfa\xe2\x05\x1f\x07\xc03{\xeeI\x07\t\xf5\xbfm\xe4\xb7\xc5\x05\x16\xe8\xbfK^hI\xfb\xc9\xe0\xbfpmq\x06\x90+\x97?\xbf\xa4\xfdr{\xb5\x00@\xf9+\x17 S)\xe8\xbf\xef~\xb5\x07\xedu\x04@=\xaa\xff4\xb3\x83\xf9?\xa8\x17\xcd\x0f\xca\xa0\xe5?\xebp\xd5\xa5"\x1d\xeb?\xcfku\xb6\xa2\x95\xbb?\xed\xfa*\x89\xc3\xa9\xd4?\x96\x95E&\xbd\x17\xf9?\xbc\xd0\x00\xfc\'\x07\xf3\xbf\x8amP\xa7\xf1\x1c\x0b@9\xc5\xafJ\xe6l\xf2?\xf25*\xb0N\xe6\xc7?\xbc\xbb\x1b\x82/i\xff?RP\xd7\xa1\x13h\xf5?W\xdbg@W^\xbe?\xfed\xd7\x90\x9c\x96\xec\xbfY(fY\xea<\x12@\xf6v\x1fa\x9c\xd0\xff\xbff\xf0\xf7]\x0f\x0f\xf0?\xde\x7fzJ\xa8P\x0b@H\xc1\x02\x90#,\xd6?Ybr)\xa78\x04@3{\x02\xd4h\xbd\xe1?\\2\x94\n\xb0v\xe0?\x15R\x10\x83hC\x07\xc0\x9d%\x01S3\x0c\xf6\xbf\xa4i\xf4\x0e\xdd\xca\xec\xbf\xba\xec\x17\x90<\xe0\xe4\xbf\x90\x90&\xea\xb8\xc7\xf5?\x87\xee\xa0\x8d\x97\xd8\xf7\xbfPO\x92\x1bt\xf9\xf2?\xed8\xa9\xe1_\x0e\xfb?D_\xf5 \x85y\xff?}\xcc\xd7\xdaw\xf5\xdb\xbfc\xebK\x82m\xdf\xb7?8a\x81a\xa2C\xf0\xbf\xeaOP6\xbb\x86\x04@\xaf\xf2\x00\t\x93\x85\x00@^\x99\xf0\xdau@\xdd?\xe8\xe1\xd3\xa9\xd4T\xee\xbf7\xcf\xadx\xff\x1b\xe8\xbf\x97\xd7\xc6D>\x1f\xce\xbfps;\x86Q\x9c\xef\xbf\xed\xce\xdc\x04\xc0\x08\x9df@\xd7_\xe1\xbf\x92\x1c\'c\xb0"\xf2?\x8dH\nN*]\xeb\xbf\xf6\xf7\x030\xed\xff\x96?\xfcR\x95okD\xed?5\x8a\xea\xfd\xb8\xbe\xca\xbf\x92\x1b%c\x0b\xb4\xe3\xbf\x80\xb6M\x18\x8a\xc7\x9c?k\x19u\xf2qny\xbfR+\x83\xdfJ\xde\xe2\xbf%U\x9cR\x02\x1a\xff?r\x11\xe9\xf9%\xe6\xcc?\xaalD\x0f\xa9\xc3\xe7?0\xfb\xbe\xfc#m\xc0?\xc0\xa3\x1c\xe5\x82D\x00\xc0\x01\xbe\xf6^\xa5|\xf9\xbf\xabN\xa7\xe1\x17\xfa\xc3?\xaaO\xc2\x8bF\xf5\xf2\xbfAY\xff2\x11\x80\xfc\xbf\x1b\xf0Ds\x7f\xe2\xe3\xbf:n\xb2[[\x91\xfe\xbf\x94\x7fy\xabz6\x04\xc0v\xa9\xbf!wQ\xe8\xbf\xc4vm\'\x8bc\xf3\xbf\x90\xa4\x89\xeaPv\xfa?$\x84\xaa\x10\xd1\x8e\xee?4o.\x14\x06r\xf4?G\x92y\xd1!\xd8\xf3\xbf\xd0\xa5\x15\xe5\xc3\x1b\xc3\xbfel1I\xbc\x1a\xe0\xbf\xc7,\xc7|\xa5\xf9\xe1?fQ?D\xb8c\xf5\xbf\xff-\xd6a\xad\xd6\xef?/V\x88K\xedk\xd4?\x02\xd0\xee\x9a\r\x95\xd9\xbf\xbe>}\xa7*\n\xec?\x8e\xdf\x87x`\x0e\xe4?\xd2\xfb\x82\xdae\xae\xea\xbf\xe5\x11d\xb3\x1f\xa3\xc7\xbf\xe8\xccxL\xb3\xd8\xe8\xbf\xec\xf6\'\xce]\x04\xff?N\x84\xd55\x9a@\x06@S\xf8\x8eB\x08\x81\xdc?\x96D\x92e\x04W\xf0\xbf\xdf1\xeb|\x05\xac\xcf\xbfR\xd0\x04)m`\xc8\xbf\xaf\x05\xca\xebT\xa8\xb6\xbf\xb8x\x1c\xbf\xd7i\xd2\xbf\xaf\x96\xe8\x12\xb5\xbc\xb9?0\xf0\x9f\xf4\x94W\xd7\xbf\xfe\xf6\x8d;\x87\x9a\n\xc0\x8e\x96\xdd\x0c\xc5\xc7\xff?E\x08\xe1\x98&\x8f\xc2?\xafcn\x92\xa5\x14\xbd?\n\xdc\x8bg\x0c\xb8\xe7?\x8ap9E@\x87\xda?\x11\xd0\xe4q\xe0!\xf9\xaa\xb4\xbfE\x92\xa7\x12\xe0\xf2\xa9?=\xa1\xea\x82\xed0\xf0?C\xa5\xba\x8e2,\xec\xbf\xe6\xf2\xb2\xa3#\x0e\xdf?\xccR\xb7JJ\x01\xea?\xcd\xa1\xb6G\\b\xe7?\x12\x0f\xf0\xa4\xf7J\xf7\xbf\xb82zFPz\xc1\xbf\x00n\xf9\xa6\x15i\xeb\xbf\xe8\xa2\x16\xa7Y#\xd7\xbf\x08\xd5]\xa4\r\x16\xd8\xbflh\x8d\xcf\xfdV\x8d?\xe9\x8d+\xd2\xd8\x08\xe6?\xe1\xf3./RN\xd7\xbfT\xf2,\x1a\xa9\xe5\xde?\x1e\\\xc8\x00\xb6B\xd0?^\xc5<&\x1c\xad\xe0\xbf\xfb\xf7F\xf9\x8d$\xc4\xbf+ \xc9\xd9\xec\x17\xc0?%\xfaU5\x0c\x94\xa8?\x80\x8c\x96\xb9]F\xee\xbf\xf2X\x89\xa4F\x10\xf2?E\x05L[\x99K\xe0?\xda\xf7P\x12<\xb9\xf1?\x9f\xf0\xcc3}\x7f\xe9?\x19U\xb0\xb5\x9a\x97\xd6?\xd6xb\x02X\x1d\x9d?\xcb\x11.\xed\x0c\xab\xf3?\x93\xe3\xaa\xe9Wq\xca\xbf~)uD\xae\xb0\xd3?\xd39\x96\xe1;\xcc\xd7\xbf)1\x93\xb4\xbba\xf0?\xae\xb0C\xb9n\x15\xe0?\x900\x98\xd9\x88\x8f\xe5?\x9b\xe3r\xdeQp\xb3\xbf\xff\xbe\xe3H\x96\xeb\xe2?\x1c\x90\xe3\xc0n\xed\xe8\xbf@\nI\xe4,\xec\xd1\xbf\x17\x9d\xd5p\x1d\xe6\xfb?\xcb\xe8\xf9rU\xfc\xba\xbfE\xed\xd2~\xc2\x1f\xb2\xbf\xf8_\xde6\xe1\r\xf8?\x08\xb3\xc5k(\x0e\xd6\xbfr\x83\x93Xl#\xde?\xe4o\xde\x06&\x08\xd0?\xac\x08\x82\x11\xba\xbd\xd0\xbf5\xcfA"\x13y\xf7?\xb4P\xc0f\xf2\x1b\xf4\xbf\xb66\x9c \x05\xfa\xd0?i\xa2\xb2\xf9\x1d\xee\xee\xbfV>\xec\xd8#\xb9\xd0\xbfn\xca\'{\x94\xcd?\x0b3\x96J\x16\xc2\xfe?\x02\xb5\xd2\xb5_\xe1\xe0?\x97G\xf2\xc9\xfe\xa2\xe8?#\xf1|\x8dX\xc0\xf7?A\xeb[\xbd?\x9a\x06@WqQ\xc7\xda\xc0\xf5? Rh\x11\x12/\xf8?k\xa0\xb3G:\x1a\xf7?#P\xba\xa3\xef<\x05@\t\xfb\x14SEW\xf7?\xfaY\x08\x1a:\x1d\xf6?\xe3\x84\x9b\xf4\x1e_\xf0?`\x87MRB6\xea?W\xa3RZ\x90z\xe3\xbf\xcb3\xf5;\xa9\x90\xe6\xbf\x08\x85\xb0\x97\xce\x9e\xf7?)\x1f\x9f\xbdS\xa3\xe8?[e\x9a\x9b+j\xdd?\x99\xd9\xae\xe0\xd0\xcf\xe0\xbf\x90\x07\xcbNOG\xed?\xc9j\xb2?\xbcT\xd1?\xdb;\x0bD\x8a\xd1\xe2?\xdb\xb24\xf0U\xc7\xc3\xbf\xf3&\xd8b\xca:\xdd?w\xdcBF\xcc\x0b\xdb\xbflw\x99&\xa34\xd2\xbf\xeec\x12\xd14\xae\xd6?\xa3K\xab\xad\x7f\xf0\xe3\xbf6\xc8W\xc1\xe3\xa0\xf2?$]\x17FU\xbf\xfb?\x11\xf1\x06\xe2\x84\xb9\xe0?\x14\x9bB\xcf\x94,\x02@\x12?E\xf5\xf2\xfe\xe7?\x14$\xbb\xae}\xd2\t@\\\x0f\xe3\xcc\xb6\xa1\t@\xee&fO\xfe\x84\xfb\xbf\xd9\xafg\\\x0c[\xe6\xbfM\xc2t\x9d\xf1\xab\xf6?\x8b\xff\xf6\xed\xa8\x17\xfe\xbf9t\x07\x91\xe6\xd2\xf3\xbf\xad(\xe5\xbd\xba\xce\xe2?@\xbc.P\xa5\x03\xde\xbf\x9d\x02\x0e7\xaa\xb0\xdd\xbf\x18T\xb6\x8dI?\xe0?%\x89zX\xa5K\xf6\xbfQTt\x97\xe7@\xc9\xbfs\xd1*x^<\x9c\xbf\xa6\x1a\xb2\x87\xbb\xed\xbb?\xc9\xa8a\xe2\\3\xb1\xbf\x85 \x11\x85\x88.\xf0\xbf9\xe3\xfd\x83\x15\x91\xe2\xbfxj\xa8\xa3\xfb\xa3\xe7\xbf\t_E\xfaDh\xeb\xbfol\xc9*\x96O\xdd\xbf?\xb3\xe2\x10\x83O\xdd\xbf\x9b\xcb6\xf2T\x11\xaf\xbfq\x02`H\xe5\xa2\xdd?\xff\x0e\x9b\xcf\x93\xc9\xf1?8\xcb\xd7\xc6/\x7f\xf0?t}d\x97\xdb.\xe2\xbf\x14\xc8\xa6\xdf\xde\xa3\xf4\xbf\x1e\xc4>\xe2\xf0\xe0\xc0\xbfXL\x05{\xb7\xf8\xeb?+\x89D\x93\xd5\xeb\xec\xbfQ\xben\x97\x1ad\xef?\x16I\xccRAB\xea\xbf\xbb\x9cL\'q\x82\xc9\xbf\\\xc2\x0b\xa8\xd5K\xe9?\x01\x8a\x9a{\x05\x88\xd3?\x90\xaf\xe5Rc.\xb5\xbf<\xa9>\xef\xc6\xb9\xa7?\xff8m\x01\xaf\x96\x00@\xa8\xc3\xe6_%Z\xf7?\x99P\xb3X\xd4\xca\x06\xc0\xe9]Nk\xd1\xd2\xe8\xbf\xe1\xef\x18\xcc;\xb6\xc9?\xfb\xcc?h~A\xbf?\xf4V\x14\xfe{\xbe\xe6?\xd9\xd3a\x83:\xcb\xd6\xbf\xff\xdb\x11d\xa6[\xe6\xbfp\x00\xee\xf2c \xea\xbf\xb0\xd9\xba\xd8\xcfy\xfe\xbf@y1%Q\xbb\xfa\xbf\x90\xe5\x99\x82\x9c\x18\x94?\xd3\x06\xe5\xa2\x85\xf3\xea?\x08s!\x1a\xab\x8d\xf3\xbf\xcd\xf2\xdb\x9cR>\xf6?\xb3F\xd1O\xabD\xe3?|\x01i\xe9j\xa7\xe7?:9M/\xfe\xd6~\xbf\xd0{\xa2\x1b]`\xf3?O\x83\xf0T(\x12\xdb?g^Q\x063\xd7\xf1\xbf\x8fC\xfeZ\x88\x8a\xdd\xbf\xb4\r\xf66\x9b0\x00@\t\x1c\n\xe7\xa6\xae\xfc\xbfx\xff:\xc3VB\xec\xbf\x83\x9e\xa3\x1c\xd8\xd9\xe3?\xa7\x86n\x8f\xa4\xea\x05\xc0\x94\x02=\x07*\xe6\xf7\xbf\x7f\xdbm\xca\x7f|\x02\xc0\x9a\x85\x1e\x1f\x0c\x9ch\xa8\xf5\xbf\x92\x0b\x01vLz\xea\xbf#\xef\x92\tF\x9d\xb4\xbf\xd9\xd8g\x01.\x92\xea\xbfx_\x9fhK\x86\xe6?\xfbYrm\xfa\xc9\xb7?\t\x81\x08E\x9ac\xa4\xbf\xf2yL\xb4\x89\xdd\xfd\xbf=]<6\xd9\xef\xe5?E^\xde^n\x80\xf7\xbf\xa8\xe7|\xc1\x8fB\xf2?\xe7\xb0\x8f?\xa9\n\xd9\xbf\x8c\xacGI\xc3\xdf\xe6?\xc0\xbc\x08De\x89\xf5\xbf\xdeB&\xd3%]\xe2\xbf\xcd3\xf2,\x9ds\xf4?\x9f\xaeU\xfe\xf0X\xd8\xbf\x19\x96\xb9j\xb7^\xe9\xbf-\xe0\xc7\x8f\xc0J\xfd?\xd9\x05L7,\xe9\xee\xbf\xb8i\xc6\xd5Ab\x86\xbf\xad\xc9\xf2q"V\xed?\\h\xfb\xcf\xa3\xf2\xfb\xbfVLk \x9cF\xb2\xbf\x93\x01\xfe8.\x94\xe0?\xc7F1\xa7,$\xc1\xbfs\xe8@\x06\xba\x0e\n\xc0\x97\xf7\xd5\xb7k<\x17\xc0j\x9cO}"\xb0\x00\xc0\xac\xae\xc8\xb5\xce\xa2\xdc\xbf\xcdz\x076\xa3\x83\x94\xbf\x05\xc7\xcbe\xa9\xe3\xe3?\xa0Q2\xa2\xb50\xe6\xbfw.\x98y\x1d\x03\x02@}Y_e\x86K\xdd?\xf4\xc3\xa61$^\xe8?\x02s\xce/\x1bl\xf0\xbf\x13\x8bz\xce\xa9\xe0\xf7\xbf\n%o\xed,\n\x04@\xe7\xc7UiU\xca\xa1?\xf2\xef\xaf\xcf\x18Y\x00@\xd0{LH14\xe7\xbfG\x04\x8f\xf1?\xaf\xb6\t\x82_r\xb1\xbf\xa5V=\xe3\x82p\xf3\xbf\xebO;\x9e\xd2\xa1\xde\xbf<\x89\xf2\xa6\xf8\xa1\x14\xc0\xba\xdc\xdb\xcdJ\x1a\x15\xc0v%\x1dK\x14\xa7\xf6\xbf\x98\xd1\xac\xeb\x1b\xb4\xf7\xbf2\xb5\xc3\x14\xcd\xc7\x17?\x91\x9bZ\n>k\xc3\xbf\xd1\x90(\x05u\xc3\xe8?\xec\xe0=B]A\xe7?y\xfa\x8bp\x12\x1d\xef\xbfk\xcbv\x15[k\xf2\xbfJ\xb5\xed\x8a\xc0\xc4\xd6\xbf\x1b\xe1E\xca\x02\xf6\xee\xbf\xbe\xd8\xb0\x04\xdb\xfe\x05\xc0a,\xe2^\xe1>\xd5\xbf\xfbq\xa1\xf1H\xc7\xdb\xbf\x9e\x1c\x1fY\x81\xc7\x05\xc0\xfb\x04\xda\xa7-9\xf1\xbf~\xda\xd2F\x968\x14\xc02\x1b\x18\xdd\xd3\xa9\x19\xc0e\xb6\xc6\xd3\x1b\xed\x10\xc0\xb6\x02.\xe0\x96u\xd5\xbf\xb3i\xe5\x18\xaf\xa2\xfa\xbf\x95m8\xa84\x03\xe5\xbf\xa7o\xeeT\xbcK\x01@\xa3fz;m\xb3\xe6?\x06\x07\xbdeh\x0c\x04@\xb6\xcfy\xc5\xa8\xef\n@\xea\x82p:\xdb\xd8\xdd?\x88\x10\x95\xee\xcf<\xd7?`\xec\x99\x11\x16\x13\x00\xc0]\x93\xf4\x84\x1a/\xcd\xbfV\xd5q\xbb\xa4P\xfe?\xfd\xc8 \xc8\x89:\xd0?;\x92\xf1\xc3\t.\xdf?|\xd0\x01\x1a\xf1Q\xd1\xbf\xbf^f9\xb6e\xb7?\xb4q\xfdyRC\xf5\xbfQ\x16\x8fK\xc2\x93\xc1?\xf4\x00\x00\xf1\xa0\x93\xda\xbf#\x95\xb2\x13n\xfc\xe7\xbfi\xeb\xc5\xa3\xea\xf6\xf1?\x11\x07\xcb@\xfd\x8d\xe7\xbf\xe6\x8cR\xb9PM\xfb\xbfY\x9c`\x98\xdfN\xfc\xbf\xb1\x18g\xc2\xd9\n\x08\xc0\xf8\xf3y\x15\xefb\xf3\xbf\xd2\x90\'\xcfR\x8d\x15\xc0\xfdE\x8b^pB\x0b\xc0\xfd\xc8\xa8\x15\t\n\x06\xc0\x8f\xf5|v\xb3>\xdf\xbf\x9b\x1f\xbf\x89C\xd8\xfd\xbf\x0c\x0bL:\xf2\x041?\xe1\xad\xdf\xc4C\xc6\xf0\xbfd\x017\xae\xf8\xc4\xcf?\x91h\x04Zw\x99\xff?s\x0e\'\'\xb9\x8f\r@g\x87\x88 \x93n\x08@@\xdfIm\x86\xc4\xd1\xbfk\x15\xc3\x08\x04\xb3\xfd?\xcd\x94\xc0\x99\x12)\xeb?\xa5\xe2\xb4Me\xbd\xee\xbf\xf8\x08\x04\xba\x06\xb3\xf5\xbf\xdcq\x9d\x8c|g\xf2\xbf9\x06\xb1Ia\xc4\xbb\xbfD]\xe7 ]\xc0\xe0\xbf\x0c\xa2Z\xe6\xd6T\xc3?\xfd,\xd5\xf7\xfc"\xf6\xbf\xd6x\xdd\x8c^l\xed\xbfN`\x0f\x03z\xc9\x03\xc0J"\xae\xa9c\x02\xde?#\xaa\xbcc\xc5\xc3\xd0\xbf\xd4u\x9eV9x\xf0\xbfY\xcb\x9a\xac\x8c\x0b\x12\xc0\xc4\xd9\xea\x1b7o\x0e\xc0.\x8d\xfd\x9clE\xea\xbf?*\x8f\xcd\x86\xf2\x13\xc0R\x9c2\xf8\x9a\xf7\x06\xc0A\xe6\x1e\xaf\xa0\xd3\xfe\xbf\x89OP\xb5\x0fb\x06\xc0=\xf9\x8bBy\xa9\x00\xc0>?9\xa8\x1a\xe7\x06\xc0\xfa\xf7\xe0\xa8\x8e\xe1\t@\xc7\x02zH\xe2u\xb2\xbf\\\xd1+\x0cS\x1f\x08@4\xce\xb4D\xf6s\x13@\xad\x18\x8e\x15eM\x05@\xf5\xa3>w4\x97\xf7?\xf3I\xb6\x96?\x1f\xe2?\xdc#6_\xbc\xfb\xbb?h6\xc7\x8d\xd8\xec\xbf\xbf\x8f\xf4\xc4\xd2\xb4\xe7\xf7?\xfc\xaaq\xc8h\x84\xef?;O,\xa0\xf6;\x02@2\xb1 \xf6\xfe[\xf9?\xa0WC\x06\xdf\xf7\n@\xe6\x10\x11rv\xaa\xfe?j7;Q\xe6\xf2\xf6\xbf]\x80:8\x80\xbf\xeb?G\x1c\xdf8]\xa0\xd3\xbf\xac\x02l\xd6"\x83\xdd\xbfj\xd5@\x97\x8c\x7f\x00\xc0\xad_\xf4y\xd7\xd9\xec\xbf\xaa\x03D\xdb\'h\xe6\xbfo\x0eu\x9e\x96\xe9\x08\xc0\xef\xb4V\x041\x9f\xf9\xbf\x95!\xf5\xf8\xa7g\x07\xc0Z{\xc3kj3\xf1?:\x11\x812d\x9e\xea\xbfa\xdcM\xd2\xfd\xcf\xf6?\xf1\xc1\x92\x87\xb7\xfb\xd4\xbf\xfd\xfajZ\xb8N\xc3?R\x19U\x0fT\x01\xf0?\x19\xa1\xa2\x0f\x07\xde\x03@B\x05D\x9a\x1e\x1f\x04@\x08o\x94(c\x94\xf1?\xe0\xf3\xf8pP\x1e\xd6?r\xcb"\xab\xder\xdb\xbf\xd5M\x00<\xe7\x89\xec\xbf\x04\xbd7\x86\xbc\x96\xef\xbf\xbe\xa7|\xab%\x9f\xd2?\x8bJ\xf2`\xcf\xea\x03@\xc9C\x075]{\x0b@d\xb8,\xabP\xb3\x14@A\xdc7\x8bn\xc9\x13@\x92h\x92?K\x1a\x07@}@\xd13$\xd7\xe1?\x85\xc8\xf0us&\xeb\xbf\x0f\tO\xf7\xaa1\xff\xbf\xf5.q\xdd+\xa6\x04\xc0=N\xd2\xdf\xf6\xbb\xf9\xbf\xf0e\x12,\xdb\xe1\xf8\xbf\x95w\xc5\xb1z\xeb\xf6\xbf_\x9a\x95g\x06\xba\x02\xc0\xdd\x93\x1bD\x86\xba\xe8?\xd6\n\xb0M#\xd9\xf6\xbf\x8f\xfc\x1c\x9b\xcd\xef\xf3?\xd36\xc4\r\x10c\xbc\xbfrAw\x1a\xe0\xd0\xbc?6\x96\xb3\x8d\xadg\xfa\xbf\xf0\x1b\xb9\x8f\xe4\x07\xbe\xbf\xcb\xa4\xc9}\x9f\xa2\x0b@S\xc3:@:\xee\x06@\xc1\n\xb0\xce1I\xeb?\x85!t\xbfb\xb2\xf0?\x03\x8d\x8f\x8c\xdc\xac\xe4?\x8bM\x9fW\xbao\xc8\xbf0vv\xcc\x05$\xc2\xbfe\xe1w\x10SQ\xf7?\xa5\xae\x08\x94ij\x00@\xad-\x17\xc1=A\x00@\xa7,f\xc1T\x19\x03@)\'n\x9dI\xe1\x0c@\x00\xba<&\xaa\xc8\x14@\xef\xc5Vv\xd1v\x14@\x89\xc8\x12\x01wT\xca?\x92S\x97\x17:\\\x0b\xc0\xbc\x1ffn\xeb\xb4\xf8\xbftu\xb9=\xc9\xef\t\xc0\xee\x18\xea\x93\xb6\x05\x05\xc0\x98\xfbb\xa6\xfcn\xe4\xbf\x92\x84\x06\xfc)\xbd\xc7?d6\xddb0\xd8\xf3?b0?O}y\xd5?\xd5\\\x07C\x9f\xf7\xf8?\x84\r\x98\xcf\x8e+\xff\xbf\x11\xd8z\xcc\x12\xc0\xf1?q>\x1cmk?\xaf?-\x8d\xfe\xd3\x8a\xdc\xd0?#lIH\x12 \x12@\xfa\xeb`\xdd\x062\x1a@\x8e\x014\x9f\xa2R\x04@\\\xa5\xb2\x1c\xb7a\x02@\x835\xb9G\xfa\x12\xd9\xbf\xf6`\xc2Ch\x84\xb5?\xde=\x0e\xea\x89\xab\xfa?)\r\xd3\xaej\x08\xd8\xbf\xe6\x19\xf5\n\xabI\xcc\xbf\x12y}\x975Z\xf7\xbf\xd3`M$>%\xe4?\xf3\x17\x7f\x06*\xb8\xf6?\xba$A\xf7\xa9\xb2\x0b@\x1f;\xe7\x08\xfa\xe9\x17@\xdb\xa2\x9b\xee\xb0\xf9\x1b@7r,\'LL\x0c@5\xbf}\x9e;\x95\x04@\xdc\xff\xdd\xc1\'\x98\xbb\xbf\xfc"p<\xf3\xb7\xd8?%\xd6\xf3O\x9bK\x00@\x9b\x02r\xed**\xf7?vn\x90\x05\x89\x16\xd5\xbf\xacM\xadi{\x87\xe3?&\xbdc\x127}\xf1?0\xdb\x18bW\xf1\xf3\xbfi\x97c\xa3\xdd\x15\xdf\xbfs\x0b\xe5\xc0\x8e\xba\xcb\xbf\xd7\xbc`\x990\x8e\xf2\xbfV\x93\xb8\x7f\\\xbd\x15@$\x89\x07\xe7\xf9-\x14@J\xf7\xe5\xe83v\xf4?\xb6\xc7\x0f.\xe7\xb7\xf4?7R~\xb3g\xe4\xb5?\x05d\xd3\x1c6\xcf\xea\xbfd\x98\x04\xb6\x8a\xdc\xe3?\xff\xfdw\xdf\xf1\xc2\xf5\xbfk\xa9\x04\xf7\xc4!\xf4?(r\xf2\x16\x90Q\xf6?E\xd6/\xd3\x17&\xfd\xbfFc\x13\x1e\x9d[\xf6?\x02V(6\xb1R\x07\xc0u\xca\x10\xa5\x05,\xc2?\x15:\x8c\n\x00\xe3\x1e@\xf5\xb4\xb8\xa2\x0b\x88\x10@\xbd\xe7H\x8eRl\x0e@\xac\x18L\x0f^(\x05@`g\x7f(\xeeu\xe1\xbff\x15\xf0\xc5\x94\x8c\xe3\xbf\xc1\xdc\x0bcw\xc9\xea?\xfd\x15\xb7\x07\x04\xf2\xd9?\xc0\xfbk\xd2\xb6\x8d\xd8?\xf5\xbd\x9c\t_|\xe2\xbf\r\xb0loQ\xbb\xe0?\xc1\x10\xf4\x15\xbb\x0e\xd7\xbf\xfbe1g\x8d\xe1\xca?V\x1b\xccr\xee+\xdb?\x1b\xcd\xd5\xeb\xab[\r@\xda\x8aWZ\xb5(\x00@I\x04\x06\xef\xc9\x86\xed\xbf \x106\xaa\xba\x06\xca\xbf\xf0k\x0c\x10\xfc]\xd9\xbf0t{\xd9\xe3\xe2\xee\xbf\x07\xc0j\x87\x9c\x00\xd2\xbf_\xdcd\xba\xd9\x9c\xe0\xbf\x8b}9\xe3\xfa\x9f\xc9?\x89;6\xf3e\xc1\xf8\xbf\xd2\x92\x91\xfe\x9f\xdd\x00\xc0(Yj\xe1\xbb8\xf0?y\xc37/:N\x80?\x91P\xa5_\xa0\xf6\xd9?6Q+\xceO\xa8\xfb\xbfsu\x07\xc8\xbez\x03@\xfbir\xca;\xa7\x0f@\x1a\x1c\xcd\x97\t\xdf\xe3?\xf4\x94\x87\x8fW|\x02@\x00\xe9\xe3\x15-\x85\x01\xc0Q\x1f\xbc\xc0\x1ad\xf9?\xe0\x85\xc3x-\x87\xed\xbf\xe7\xe9\x8a\xc28\x84\xe9\xbf\xfe_\xfe\xbf\xb0\xc6\x02\xc0&\x99-\xe9\xc3\x81\xf2?\x01\x97\xb6\xbdM\x91\xe2?\'Y\x100\xd6K\x05@\xcf\x11A?\x1eS\xd2?X\xa0\xe0\x9d?P\xf8?\x03\xc4E\xb9\xae\xf7\xe2?\xf0+LPP\x95\xe6\xbf\x14\xabd/Ha\xee?\xcc\xb2&)D\x14\xf2\xbf>\x8ap\xc4\x03\xc2\xe4\xbfNlW~:\xa7\xde?\xf05\x11I\x072\xf1?\xeb\xe5\xa4\xe6\x8a\xcd\x90?\x81A\x8e!\xac\x1e\xfa?9\xaa\xc6=jD\xde\xbf\x03F\xa1\x1d$\xc1\xfa?\xfc\xfbx\xe4~p\xe0\xbf\xa6Q\xb6U\x8d\xc3\xe1\xbfZ\x98|\xaca\xa4\x96?H6\xb11\xe9\xba\xf3?\xdb\x944z\xa8\xd0\xf7?\xfb\xf1\x05h\xca\x07\t@\xaa\x1d\x1f\x7f\xc99\xe5\xbf\xe8h\xb2`\x8d\xa4\xe9?G\xce\xcc\x89\xbc\x19\x03@5\x13\xa6\xd185\xe5\xbfv\xc6\xe2\xda\x95\xd6\xc7\xbf\x86L\xe1\xec\xfa_\xda?2\xbf\x9b\x1f1\xcb\xd9?\xfey\x02ZQ\xe9\xe7?(\x13\x04\xb7\xe3\xe2\xd6?\xb8&\x91\xd6$t\xee?M\x14?Gg\x96\x03@>\xb4\x8by]R\xcb\xbf\x0ck\x16\xb7j\xd4\xee\xbf\xde\x9e\xdf\xf0&\xa5\xe6\xbfW\x05G&\xc4\x8f\xe6?\x02B\x88\xf0\xe2G\xc0?i0mE\xc1B\xef?\xf6\xfb\xcf\xdb6\xdc\xdb?i\xd5\xd2\xb1\xb2D\xe8\xbf\xf3x\xa4\xbd\xb0\x82\xe8?\x8d\xc5\x05[\x0c@\xf3\xbf\x0b7\x0f\xcb\xa4-\xe0?c\xfc\xda\x84=:\xf8\xbf6\x0c\x18G\xf0x\x06@\x8dZU\x16_\n\xb9\xbf\xd7\x91\xd6\x1a2\\\xe9?\x05\xce\x9bhT\xc4\x02@/\xfc\xe9\x81\xc4\xc9\xd5\xbf\x1d\xdb\xb4L\x92\x0e\xed\xbf\xce\'\x9e\xad\xea\xa7\xff\xbf\xb7E\xc1\xcd\xa6\xb2\xd2\xbf\xce&6\xd5\x1a1\x90?\xec(\xcb\xdfK\xb0\xa9\xbf0>+e\x8e\x8a\xf8?\xd9\xaa\xb6e\x8d\xba\xe2?\x88\x9a\xf8}\x02\xf4\xea\xbf\x9f\x96\xdb\x8e%\xf5\xf2?\x03M\xeb\xd8\xd2_\xfe?\x03\x0b.\xe0J\xcc\xff?\xf7\xbe\x82@BX\xec?\xae^\x0f\xf58\x93\xe2?\x12-\xa3R\xcc|\xea\xbfi;j\xe6\xf3\x98\xef\xbf7\xfcq\x93\x91\x99\xd7?\xdc\xee\x18\xf7\xc5\xa5\xf5?\xf1\x9b\'\x08\xf8\xb4\xe7\xbf\x8e"k\x93\xeb9\xf6\xbfU\x9e=?\xf9G\xfe??\xf3\xf0D\xd0\x91\xc7?#3Uz\x95D\xc4?8\x84\x9el\x13\x12\xf2?I\x16\x83b\x8a\xe0\x81?_\xb0GX\xfc\x07\xdb\xbf\xc9\\\x04\x05\xc8Y\xd6\xbf\x03#\xe2\xe5-c\xe1?\xfe\xffS&\x945\x05@\xbd\x9e\xb6\xdb\x8c\xd8\xf2?\xeb\x0b\xd0\xe5\xac\xbf\xf0\xbf\x98\x1462Nv\xc1\xbfz3\xf2\x96\xde\x88\xc0?]_#S8\x07\xf0?\x960\xad5\xf2u\xe7\xbfV\xbe\xf6\xd3\x17\xb7\x08@(\x08O\x8f\xfex\xce\xbfL\xc3\xfa\x84\t\xe2\xfe?;"\xe7\x92\x16\xfd\x02@+\x88ro\x7f\x9a\xf5?\x12\xc4\xc4l\xea\xd7\xf4?\xfbn\x19l\xde+\xef\xbf\x9d\xe5\xc9\xae\xac\x08\xe3\xbf\xa8\xca\xeb\x87\x11\xdc\xf3\xbf\xfb\xdfz8\x92\xa3\xd5?>\xcedm\xc1N\xda\xbf\x86\xbe\xc8\x12\x82\x89\xf0\xbf\x169\x7f>0m\xe6\xbf\'\x90\xd2\x9fk\xcd\xed\xbf}\x92\x1d\xd3\xd1\xde\xd4?\x1b\x85\x84\x96\x03H\x04@\xf0KE\xe6\xafz\xf2\xbf5\xf4W\x987\xf6\xf7?/\x8d\xcah{\x06\xf2?Vq\xf2w!\x90\xee?\x05\xfas!n\x07\xe3?\xec\x936\xc5\xa4%\xe4\xbff\xec\x11(\x1c\xbf\xb2\xbf\x10Vv\x0b\x0c\xa4\xf6\xbf\x95c\xf1x\xb1:\xe9?d\xa9\x08)\xa1*\x04\xc0"!yi#$\xdf\xbf\t\xad\x00\xe1\xeb\xfc\xf9?^\x9eP\x95\x00\xe9\xf8?\x83\x1d2l\xae\xb8\x06@\xce\xa3\xc6\xed\x01\xbb\x05@V\x11\xeays/\x02@\xcf\xf0,\t#;\xee?]\xaf\xcfO(;\xeb?V\x1c\xbe\x8a\xca\xb0\xfb\xbf\xb1\x8eSo\xcaa\xd1\xbf\xb8\xf11\xd4%\xbd\xdf\xbf\xb9|\x05\xd8f\xc4\xf0?"1\xfdu\xcam\xe3\xbf\xe1\x07VG\xea\x91\xf7\xbf\x98\xbb\x13E\xa9\xd2\xfb\xbf\xed\x00@\xe3^\x86\xf1\xbf\xcd\xe0\x8f\xca\xbf}\xf9\xbf\xc5\xf9,\xe0\xf2{\xd6\xbf\x82\xb1D\x12\t&\x00\xc0&\x12R}C\xa1\xe8\xbf=Y\x19\xb6P\x9c\x01\xc0e\x03&\x9e3!\xdb\xbf\x92\xf3\x87\x88\xc1\x15\xee?{\xe6g\x85\xb7A\xf8?\x88.8\x8c\x97\xa1\x00@2\xe5\xbc\xba\x10\xab\xd2\xbf\xde\xca\x00f\xb0)\x02\xc0@\xcc\xfc\xbf\xe9f\xfa\xbf\xc7*\x8c\xe6u\xf3\xf1?\xbeWl\xd1\x0b\x02\xf3\xbf\xd1zi\xfaE-\xf2\xbf\x17\xc9"\xf2\x16t\xc4\xbf?7\xb0\x11\xafC\x03@\xbav\xb7B\xb38\xf7\xbfr\xd5P\x0f>g\xd3\xbf\xd1\xa8Z\xc4\xc4U\xf0?\xb3\xe4I\xda2x\xeb?\xf2\x9d|Yh\xe4\xca?W\xe0/K\xca\xbe\xe2\xbfWzO[jV\xda?\xb0\xb8r\xe7\x1d\x95\xc4\xbf\xfd%\xa0\xf2\x9b\x91\xe6\xbff\\\xa4\xb1\xee\n\xf3\xbf\xe3\x05;\xc5\x11\x17\xea?\xcb\xc3\xba\xcb\x94k\xda?\x86\x07\xb9\xc0X\xac\xd3?T\xd5S:\xa7\x86\xe0\xbf6\x856T\x93g\xf7\xbf\xe8\xb8\xdek@\x8a\xc8\xbf\x9e\xd6\xadMR9\xc8?\x17\xbf\x992\xafL\xec\xbf\x01\xdf\xf1\x8fn\xac\xf3\xbf\x18\xd9_\xdab&\xe8\xbf\x08}\xa6M]&\x0b@\xd3\xd6G\x06\xc4J\x07@\xf5\x89\xda\xe6\x8d\xc3\xd6?\xec\xab\x9b\x88bW\xd7?\x80\x16^\xe1\xf4\xc9\xee\xbf\xcf\xf1aIa\x98\xe6?p\xdc/\xf8\xb8\x1a\xd8?Y&y\x9f$9\xe3\xbf\x10\x1e\x05$2B\xe6\xbf\xa1\x86\'6\x8e\\\x00\xc0\x89\xad\xcd\x8a\xdb\x81\xf2\xbf\xd8\xff\x94\x84\x9b\x85\xb7\xbfc\x01\x1f\x97\xe7\xcd\xe3\xbfE\xe0j\xd2\xe7?\xde\xbf\x10\xb2?\x89:\x95\xf3\xbf\xe1\xbclY\xc1\xd9\xd4\xbf?c\xbb\xb7\xa0\x8f\xdb?h\x1ea\xb3\x8b\xfa\xe6?\xba0\xf7\xd0a2\xd3?\xbai\xf6sJ\xd6\xf0?\xfe\x97\xa8\xb8\'o\xcb?\xde\xab\xb8X&\xb0\xe4\xbf\x02hSh8<\xe6?I#\xa8\xfe\xe0t\xfb?\xa5L\\Q\xd7\xe3\xed?\xb8C\xf3WH4\xf4?{c\x84\x14\x97U\x07@\xc8U\xc9\xadb_\x02@\xb3\x8a\xb2\x05];\x05@\xe1\xa7b\x08\xd9q\xf2?7E\xcd\x90*\x88\x00@\x94\xac\xfe\x9f\xb4\x13\xa1\xbf\x19\x05-\x90\xe4\x03\xee?w\x054\x91\xce\x98\x9e?\x8e>\xcf\xd7\xdc\xb0\xe0?1{\x80\x92\'\xb3\xc8?[Z\xf0\xf6\xa7W\xd3?\xd3[p\xae\xbc\xfd\xb2\xbf\xf6\x80\rJ\x8d{\xc5\xbfs\x1e\xe1\x16sK\xbb\xbfL!\x10\xf0\xb8r\xd5\xbf,Q\x86\xd2\xf4\xd5\xd4\xbf\x02\x08\xd4F\x84\xc1\xe8?\xcd.\xc6\xa8\xa5\x17\xd8\xbfa\x896\x81\xb4\xd1\xcb?"4\x98g*\x0c\xc0\xbf\xfd\xc3o\x84\x15(\xe8?Q\x04\x13Xa\x90\xf3\xbf[\x18\xc8\xf6U\xd1\xe5\xbf\xd6;yS\xf1\x86\xd9?\x04\x99\xac"/\x1c\xe1\xbf\xb1_qnc\x8d\xe3?\xdc\x11\xa4\xb3\xc4\xa4\xe2?\x81\xda\x8eG\xd2\xcf\xd0?\x83n+-\x86\xa4\xd6\xbfb\xaf\x880\x871\xd7?\x1d\x8f\xaa\xac\xa6\x1b\xe2\xbf1\xa5\xee-\xe1\xe2\xe7?\x05\xd4\n\x00\xad\xa6\xe1\xbf\xd8\xbeq\x92\x88*\xc4\xbf\x02o@\xaa\xcf\xd0\xc2\xbf4\na\x8e\x90=\xa6?d\x18\xb9\xfc\x10i\xed\xbf\xe8D\x17\xca\x04\x06\xe3\xbf\rJ\xc0\xc9\xff\x8c\xfb\xbfq\x95pV\x01\x8e\xdd?\xb7\xf2\xdd\xb6{5\x02@\xfc\x08}\x98#{\xe4\xbf\x0b.\xbc(\xe5X\xca?\x1a\x93\xc4\xdb9\xe3\xc2\xbf/g\x18\x92\xea\xa1\xff\xbf\xc89\xed\xb9\xf7\xbf\xd9?\xdc\xd9\xf2Z\x95\x87\xd8?\x06\x8c)\xe1\xb7\xe0\xe3\xbfI\xba\x1d\x0e\xcbI\xc4\xbf\xf2N\xa1iLF\xf2\xbf\xff\x04\xc6qq1\xf3\xbf\xe7b\x8d\x95\xee\xf3\xea?E\xb7\xf3\xb8\xc7\xc0\xce?ag\x1dQ{\xb4\xf8\xbf\xce\xbeB\xae\xd3E\xc0?_\xddq\x12l\xac\xc9?\xc5X\\*~\r\x85\xbf>\x8e\xda\xb0\xe1\x18\xa3?\r\x01\x8e\xd3\xd8U\xb8?\xa6\x97zO\x1aX\xe1?s\t\xec\xf5o\x12\xc6\xbfu\x99y\xf8\xd7\x13\xbf?DX\x82\xf2H\xb3\xf7?\xd8\xb2\xf3\x8c-\xe0\x94?\x9d\x0f\xffk\xf7\xcb\xda?\xd2\x8bWp\xc3\x05\xd4\xbf\xa0\'DL&\xb9\xcb\xbf$%@\xff\xce%\xf5?\xdc\xc9h\xbc\x920\xf0\xbf\xf5U\xeb\xbc\x11Q\xee\xbf\xc45\xdd\x91+a\xc6?\xb1\xd5s\x88\xa7\xbd\xc9\xbf2.\xf5\xd9hX\xa5\xbf\xa8\xf5 )\x01\xf8\xf0?\x8e\x0c1\x1f\x8e\x7f\xf4\xbf\x14\x9d\xaeG<\xcc\xa2\xbf\xa6$\xe4\xe8K\xad\xe0?b*X\x0bG\x08\xc3?\xfe/\xf5Z\xd9\xc1\xef\xbf+\xbe\x80\x15zC\xe2?\xebo\x00\xa0\xbex\xe6\xbfX=\xf5\x85\xc9 \xdb?v\x07\xddxv\xb2\xe0?\x89\x88w\xac8\xa0\xe6\xbfy\x8bK\x8aG\x1a\xf6\xbf7\xadp\x8b\xf0\xb2\xe2\xbfq1e\x05i\xad\xcb\xbfW\xa8\xd8\x03\x9c\x9b\xed\xbfY77\xecZ(\xe3?\x88`*\xd8\xf0\x8f\xd6?i\x91\xed^\xe6\xb7\xf1\xbf\xa3p\x10\xa6\xe6\xbe\xbf\xbf\x8f{\xad\x19\xf7C\xf4\xbf\xdf\xba\xc2\xf9MN\xdb\xbft\xbf~k\xe3f\xd6\xbf5<\x97(\x0cW\xd6\xbf\xee\x87\xf2\xb9`\xd2\xb7?.\xf1+t\x9fB\xb5\xbf\x0fbe.\xe1\xf9\xc0?\x1a$X.\xad\xbd\xd9\xbf9K\xcc]\xbe+\xd7?\xac\xda\x91\xde\xb2\xbe\xd6\xbfZ\x84\x90<\x80Y\xf7?\x10x}\xbb\xd7\xb2\xb2?\xd2|\n\x0b\xd3\xc2\xf0?\x90\xf1\xd2N-j\xe2\xbf$\xbd\t\xaaZ?\xd8?~\x9b\x8cE\xe9\x84\xca\xbfEA\xbc\xc2@\x01\xe4?\xdc(4\x08;F\xf3\xbf\xe2\xd3\xda\x02\xb1\xe1\xd5?\x1b\xf9\x07\xe92\x80\xf1?\x1a\t\x98A\x11\xac\xfd\xbf\xc6\r\xde\xfc\xd1\x14\xc0\xbf\xd0*\x89T\x0fy\xdd\xbf\x7f~n\x9d\x13\\\xe2?\xcf\x08\xc8!\xe0@\x9f\xbf\xec\x93\xf1N\xc1)\xfa\xbfGjSug\xf8\xb8?id\xc3\x0f\x19\xeb\xc2\xbfD\x1f\xcd\xc7\xe7\x1d\xb3\xbf\xec\xd2M[\xb9B\xc4\xbf\xcek\x0e\x94\xa1h\xbf\xbf%\xd1\xcd6\xdcD\xef\xbf\xa6!\x88d_\xdc\xbc?\x13\xf3t\xce\xba\x9eF\xbfT>\xd9l\xbdp\xf1?\x82\xf3 \xee\xcbc\xff\xbf\xd7H\xb0,&,\xb8?\x0c\xce.\xe9\xd4\n\x8f\xbf\xc0\xa5\xcd~\x1d\x07\xe3\xbf"yX\xa9\xa2\x17\xe8\xbf\\\xbf\x0f\x9a>|\xfb\xbf\x95\xb9\x87\t\x88\xad\xe4\xbfC\x9e4\xaf\xe8\x8e\xe0?u0{\n\xf6\xfd\xef\xbf\x03\x1f\xaaa%\xc4\xf6?~\x9f4\xec=\xf9\xb2?1\x89\x9dCA\xbd\xed?\x98\xe6\xc1\xca\xb1\xb1\xf1?0u\x96\x90\xd7v\xfc?\xaa\x1fx\xc5\x05z\xe3?6\xad\xa1\x1e;\xbe\xb7?\xf7HDW\x19-\xea?\x0e\xf3a\x92m\xd9\xff?\x14\x13]\x0e\x82>\xf1?\x81\xfb|[g\xf3\xa4?\tn>\x81\xb2!\xdf\xbfc\xc5\x81z\xec\xd9\xee\xbf\x93\xb0\x87\x144\xc3\xf8?\x06l\x04\xaf2-\xba?\xe9\xf4Y\xb3\x12\x06\xdc\xbfm\x95\xbf-2<\xfc\xbfh\x82\xe0M\xe7\x1e\xf6\xbf\xae\x1a\x957\x988\xba\xbf\xf9\x85\x7f\xfdjo\xca\xbf/<\x9a(w\xf3\xa9\xbf\xdd\xbb\xd3\xdb8=\xc1?\xca\x9eDF\x0e\x81\xcf\xbf\x0b@\xb8\xbe\x17\x7f\xc8?\xf5\x7f1\x91\x9c\x95\xb8\xbf\xd6\xf3K]~\xe5\xe1?i\x1b\x11\x8c~\x84\xe9\xbf\xca\xe3)\xc1\x87\x03\xf7?*\x02\xfe\xed\x886\xf7?\x15\xab\xe5\xbe5%\xfa?\x1d\x81\x00/\x80k\xd8\xbf\x91\xe1\x03\xf4)\x8f\x04@t\x13\xe8V\r\xe0\x00@\xcbp\x92$\xb0B\xf2?U\xc6\xd0/\xa9\xf6\xdc?\x81%\x8a5\xb7\x99\xf8?*\x1aL\xfap\x9e\xff?\xc3\x9dO\x0e\x06:\xe9?5L\xf3/g\xcb\xd3?Q\xafs\xe3\x89\xf0\xf5\xbf\xd4\xb8\x82\xec\x1c\xd3\xf7\xbf\xa7-\x8bg\x9f\xed\xca\xbf\x01_\xef\x82\xe2\r\xf6?\x96H\xee\x0f\xf3Q\xf1?s\xe8H\x820;\xd3\xbf\xfd\x1d\xe2\xd6\xfcw\xe0\xbf\x89\xd9\x1e\xc0\x7f\x03\xcc?[\x8d\x80\xdbaz\xeb\xbf\xe2\xaf\xbadZO\xe7?V\xa9\xfb\xdf\xf8\x87\xd8\xbf\xf3.\xf9\xe0\x83\xa6\xf2?\x06^ik\xa1<\xe8\xbf5\x01\xc6\xbc\xf0+a?h\xe1 \xb2Y\x7f\xf0\xbfP\xa3\x06TW9\xf1?\xd3\x12CP\x172\xea?\xc1\x13\x15-K\x88\xf0?\xb5\xb0\x8em\xc2\x8b\xc2?xw%o2\x98\xeb\xbf\xe6\x8e\xa1\xa3e\xa1\xf5?){^\x99\xdf\xd2\x18\xc0\x0f\x9e\xb9\x02f\t\xf5\xbf\xf4\r\xc9\xf9|\xfd\xec?\xb1\xdcR\t\xa8E\xef?\xb3\x08\xb6-+\xce\xf3?4\x11\x05;1\xcc\xe3?\xc9=C\xa8%\x86\xe3\xbf\x89\xdb\x82\xa7\x1f<\x07\xc0\xe5\x1c\x8b\xd9i\xeb\xd7?\x82:|\\\xb9\xb2\xe3?=5\xda\x98\xeb\xba\xce?\xf9\x95\xe9\xb9\xc5\xbe\xd6\xbf@?/\x92x\x0b\xcc\xbf\xcf\x99eS\xb6\x91\xd0?F\xc7\xd0\xca\xa0\x87\xeb\xbf\x06@\xac\xd4\x11Q\xf6\xbf\xd9&t{ao\xbb?\x96\xcd\x10\x9b\x15\x9b\xeb?\xe9d\x81\xf0\x15r\xe0\xbf]\x94\xe3\xf6G\xa6\xd3?\r\x08\xea\x96LS\xf6?\x16q\xc1\xf2\xa9\xef\xd9\xbf\xa4J\x8e\xdfK\xb5\x03@\xac\xcd\x9a\xb5B\x8f\xf4?\x87\xf8\x7f\xf3;F\x10\xc0a\xb2\r\x84\x1f\xc9\x0b\xc0\xb4U\xef\xcd\xadD\x07\xc0\xa4\x1e\x9c\x14\x97\xd5\xfd\xbfc:\x00\xdfD\xe6\x06\xc0\xc2H\xca\x93\xc0\xd8\x10\xc0\xbeO-l\x88/\x0f\xc0\xe3\xd1=L.\xec\x11\xc0\n\xa0\x14l&\xb1\x0b\xc0\xfb\x1e^Gy_\x12\xc0\xcb\xf1\xd8\xa4\xf1\x92\x04\xc0Y\xfa\x14\x9e`\xd1\xcf?\x89\xb1,\x13\xfe;\xf0\xbf\xba\xae\x84C\x8d\x93\xf0?\x85}\xf3\x93\xfb\xe8\x12@\x02\x86a6\xf8\x1e\xf7?|\\\x81\x19Z\xaf\xe7?\xbf&T6\xf8\xf9\xc3\xbf.\xb2z_\xd7\xe2\xf0\xbf\xe8FI\xcd?\x95\xe0\xbfa\xffY\xb1\xde\xef\xe2\xbf\xcac^\x9d\x863\xf6?\xb2\xb3R\x14\xf7:\xc8\xbfw\x11U\xec\xa5r\xf8\xbf,S\x0cem\x16\x03@(\xbf\xa9\xa4\x90:\xe6\xbf\x85L\x88\xf5br\xd2?\xdcF\xe7M%\xfd\xdc?Lzi\x9a\xb5k\xf9\xbf\xd6\xbf\xee?L\xee\x00\xc0l\x18\xe0\xc2\xea\xbb\xf8\xbf\xf6`\xc4y\xbe\xe7\x0e\xc0\xcc\x0e[\'\x05X\x0c\xc0\x07\xd3~\x12\x92\x15\x17\xc0\x8c\xe1\x1f\x8d\x0f\xd2\x0e\xc0\xca\xe0\xbaWh\xaf\x12\xc0G?@\x02E\xd0\xfa\xbfE\xb4\xc1\x96g\x88\x00\xc0b\x8b\xe6\x89\xfe2\xe4\xbft\xec\xea`\xcf_\x14\xc0P\xe6\xe9\x8e}]\xe3\xbf\x9a.X\x92L}\x9e?C\xd5\xf4~\xaa\x83\x8f?2\x93@W\x0e\xec\x01@\x9c]\xaa<\xa9\t\x06@Ccs\x88\xe1.\xf5?\xaa\x0c\xcc\xe8IQ\xf4?\x14Oe\xfb\xd7\x9f\xe1\xbf\'\xc3Ai\xf3r\xd6?\xd2\x9f\tJ]\xba\xdf?Ge\xcc\x10\x93m\xcf?\xae"\xb4\xa465\xe2\xbf\x93\x1d\xc2{\xca\xec\xf7?\xd4\xb5\xf1\x1f0g\xd6\xbf\xe8}t#\x84\xfe\xd2?\xc08\x89\x1cp\x89\xf6\xbf\xb0\xeb\xc3\xd6\xbdt\xda\xbf/\xe2\xb0\x04\xc52\xd0?q\rgNc\n\x04\xc0r\xf7\ti\x99S\xfa\xbfQ\x1f&\xb5\xf5\x84\xf5\xbf\xa74H\xf1@\xed\x13\xc0\xd8\x89cs\xc2\x81\xd3\xbf\xbc\x84\xea;\x16\x80\x18\xc01\xaa\x0b\x10\xe2n\xe9\xbf\xf4\x9c\xec\x99\xf1\r\x03\xc0F\xd4\x00[\\\xf6\xf6\xbf\x1c\xe8\xb0z\x80!\xf5\xbf\'\x11j\xa8\xe2l\xa0?R\x99\xc6\x11\x1d,\xb9\xbf\xa4\xf6\x94V\xa3q\xd3?\xd3\x11v\xbb\xc6Q\xf2?1\xfa\x92f\'z\x02@\xab\x14r\x7f\x90(\xea?\xd01\xbb\x1b\xd8\xc9\xe0\xbf\x83\xf6\xa3F\x92\xbd\xbc\xbf\xa1\xbf|\x87.\x9a\xd4\xbfn\x12a\xda\xb0\xad\xf4?m\x7f7\x88\xcc\xd7\xd9\xbf\xaa\xfe\xe97\xd1\xf9\xdb\xbf\x9fM\x1a\x7f\xff\xce\x01@!#\xbb1)n\xf8\xbf8\xf9\xe0\xbe>8\xda\xbf~\xfd\xde\x97\x1f\xe9\xf6\xbf\x01\xb9\xe9jX\xf8\xf1\xbf\x04o\x1f\xb2\x1a\xbd\x06\xc0\xde\x9e\xfeMCc\xfa\xbfl(\xfb\xae\x9c\x8f\x06\xc0\x9b\xd9\\\xab\x9e\x9e\x01\xc0\x122\xb9d\xces\x17\xc0\xdcK\xd6\x0e7e\x17\xc0\xc8\xb9$Hx\xfd\xec?!r!9\xac\xb0\xde\xbf\xdbmZA\x851\xb2?\x01\xfbA\xe5N\x07\xc4\xbf\x0b\xc9\'\x90\xa1\x00\xe7?;_\xa1\xf9\x1dA\x06@\xd8;\xb5\xb9H\xbf\xd1\xbf>C\xd8\xf8\xf6\xbd\xdc\xbfW@{\xe1\xe7\xcd\x8a?\xd2"\xbaF\xfcT\xc8?\x18\x8a\x90\xb4\x08\xf3\xd5\xbf\x97\xdb\x00\x85\x91\xc5\xd6?Z\x1d\x06t8\xe4\xe8\xbfm>c\xd1\xbb%\xf0\xbf\x87^\xe0\xf6\x8c\xcf\xd2\xbf\xf5H-\xdbHB\x06\xc0ln\xdc>\xb4\xf6\xda\xbf\x1f\xc8\xd3\x9e\xa99\xd8?l\x11QA\x11\x18\xdc\xbfcm\x80\xd7(1\xf6\xbf\xf0\x13[\x10\xa6R\xf1\xbf\xb06\xc2o\xff\xe7\xef?A{}\xa7\xf0\xbc\xf0\xbf\xba\xb6\x1d\xd8\xdfs\xe7\xbf\xfb}\xdd\xc4\x9b\xd8\xe1\xbfb\x8e\xaa\xf63\xc4\x07\xc0\xd6{\x9a\x15\xf8\xf1\x1b\xc0\xd8N\xaf\xd9\xc0\x04\xee?\\!\'\x12g\xd1\x08\xc0\xfa\x1b\xcdo\xd2\xb4\x00@)\xe2\xacmT\xf6\xe2?\xe0\x9e\x0eA\xc9&\xe2?\xc1R\xb5\'\xd6_\xe6\xbfU\x00\x8420\x9b\xfb\xbf\xb5fo+\xeaV\xc7\xbf.\xf4\xfa7\xa2\x89\xfc\xbf\xe5tC\xdan\xb8\xe3\xbfg\x12+\xce=7\xe2?\x14~%\xa7~\xd7\xf1?\xb2\xa1J\xba\x9e\xb2\xd7?:lR\xbc\x93^\xf2?\x04\x1c\x90\x87\x8b"\xbb\xbf\xb3u\t\xd2\xd5+\xdd\xbfK\x1eZ\x8f\xf1\xe5\xc9\xbf\\\xf5\xd9\xecSH\xea\xbfiM,\xbc\x10\xee\x01\xc0\x13z`\xf7\xeb\xe7\xeb\xbf\xcco\xf6aT\xae\xf2\xbf:a\xe3\xdf\xde \xee\xbf\xdd\xa5[\x15\x7f\xba\xf5?\x1c\x0bq\x13\xc4\x0b\xe6\xbfL\xa2\xebl\xfdG\xee\xbfZ\x02\xfb\xb0c\xca\xdc?0\xf9\xda\xa9\xcc\xf5\x1d\xc0mRi\x02$\x91\x03\xc0\x85Z\xd5\x83\x94/\xf0?\x86"\x86\x9fE\x17\xe4?\xddj\xc8\xda\xf3D\x01\xc0\xdb\xc8\x9fEb\xee\x05\xc0U\xad\x85\xfa\x8f\x90\xf4\xbfj\xe4\x95pV\xce\x01\xc0\'Y\x8f\xc45\x00\x06\xc0\xe5i\x18\xc2s^\x0f\xc0\xf8;\xd8h\x1bm\x05\xc0\x86\x83\x04\x80ZD\xe3\xbfD\x86<\xd1!\x8c\xc6\xbf\xd5\xa5u.\x9a\xed\xd2\xbf\xe1z\xe7\xcfIE\xfd\xbf\x9c\x98\xab\te\x9e\xb9\xbf\x88\xfd.\xba\x80\x1f\xe1\xbf\x12\x12\xb4=\xa8W\xb6?I\xbb\x19\xee\xef\xe7\xf2\xbf\xb0\xd1\xb5J\xdc\xd3\x06\xc0\n]mR:\xa0\x0e\xc0f\x8d~\xf5\xfc~\xf8\xbf\x97n\x9f)\xa6\xf4\x01\xc0\xc8\xe1\x83\x07\xa0\xe3\xe6?\x19\x92\x11r\xb2V\xec\xbf\x8c\xabk\x8f\xc95\x08@q\xdd\xfd\x10\x8cT\x07@|~N\xb6B\x9a\x13@\x99\x01<\xa9\xc2Z\x0c@w\x84\x8d\xf1s\xbc\xe3\xbf\x1eL\\Te\xb0\xe1\xbf\xba\xd9w\xbbg\x9c\xf9?\xeeAR\x8c\x03+\x03\xc0\xd2\x92[&a\x90\xf1\xbfl\xb7 d\x13-\xf3\xbf\xf2DF\xbc\xad\x12\xf9\xbf\xee+\xafa\xabG\x03\xc0?x\x1a9T\x82\xf4\xbf\x08\x94\x0b\xfc\xdf\xfc\x07\xc0\x14\xe7~[GZ\xf3\xbf\xf0M\x15\x1a\xc7\xeb\xea\xbf\xdbm\x96\x87\xef\x9f\xe2\xbf:3Gv\\\xbd\xcb?\x1ea\xed}P\x8b\xc7\xbf\x01\xce\xc36\x85\xb2\xdb?\xd4\x9a\xa3{\xcc\x94\xe8?!\x1c\xb0\xcd@#\xfb\xbf\x7f\xf3\x1a+\xd8>\xf2\xbf\x1c\tj\xa0\x00!\xe4\xbf\x965\xa0J\x9cP\xfd?\xfc\x0e\xb1\x8e*E\xfa?\x91V\xef\x06\xd7\xaa\xd5\xbf\x8e\xa2\x0c\xcdC\x06\x07@\xdbQ\x9d\xe5+\xae\x0b@%/\xa3\xf0\xd9\xfa\x0f@\x8c\x19\xde\xeaze\x1d@\x02?\xc8n\x9c\xf5\x9c?c\xaf\xcbN\xb8\xec\x11\xc0\x19\'3\x94\x97*\x0b@\x97\xdd\x05T0z\xe4\xbf}g n\xf0>\xf4?\xe4\xa4\xaa\xd6\xc5\x82\xc1\xbf\xcf\xa0eo\n\xb5\xd3?\xc1\xb8\xb9\xd4\x0e\x7f\xc9\xbfb\xaaJ\xe9\xd5J{\xbff\x00\x87\xbd\x83a\xea\xbf\x92\xa2\xc5\x07\xb7\xd8\xdb\xbfO\xe0\xabd=\xde\xe0?\x84\xc8CG\x921\xc0?~\xb0\x80\xa6\r\x17\xf3?x\xc1Y\x96\x03\xa7\xe9?/2.\xa7T,\x84?[V]\xff\x93\x84\xee?\x82\xaeb\xb7\xfa\x9e\xe3\xbf\x04\xe9\xf6\xb2\xae\xf7\xdc\xbf\xef\xff,\xb5WH\xd4?\xe0_\x83\x9c\x04E\n@W*\xfc\xd9\xc9<\xe2\xbf\xe8\xc2\xf8%\xe3\x92\x11@\x0f\x9d\x11;\x9f\xbd\xe1?$^y\xf0{]\t@\xc2b\xc4\xa7\x11.\xed?\'\xbcj\xca\x16*\x14@\xb2\xe0\x9b@\x8fJ\x13@#\x82\xde\xe4\x06\n\xfe\xbf\r\xaf\xd6\x83\xcb\xa5\xf7\xbfaC\xdd\x97\xbd\xa4\xf5?\xff>c_p\x02\xd4?\xf9\x0fX{+\xf2\xfd?m\x07ZR\xf04\xff?\xae\xfc\xb1) :\xeb?Ty\x8d?E\x97\xfd?\xa9\xcf\xdaV\x18j\xb9\xbfy\x92\xce\xa3\xba \xe9\xbf\xd4\xfd\xef-?\x19\xf3?v\x04o*\xd9K\x03@1\xc0\xad\xe2*o\xed?\xad\x07\xd3\x1e\xab\xc8\xf2?\x87\xb7FVp\xcb\xe7?\x12Ew\t\xa7\x86\xb7?n\xbc\xd7Jh)\xe8?\x94\xb68[J^\xed?JT\xeb\xa9\xaa\x03\xc7\xbfb\x0b\x0e\xc4\x07\x1c\xdd?\xbd\x15\x9az*H\xf3?\x8aq\xf4\xa0 \x18\xe9?c3e\xd4\x8d\xc5\xf0?\xab\n\xab\xee\xcc\x05\x08@\xeek\xe4@\x17t\x12@\xe4\xdf\xbe\xf4\x7f!\xe4?*\xc8`9J\x14\xd7?\xca\xec\x82\'\xc7\xa0\x12@\x80lp\xee\x1d\xe2\xc4\xbf\xab\xdd\xeb^\xcev\x01@3`5\xdd\xf7 \xe4\xbfsn\x00\xea\x19\xbb\x11@\xec\xd0aH\x89\xc6\xe7?\xcc\xc8w\x81CZ\xf5\xbf\n\xf6H\xb7Ti\x00@\xbf\xb3\xe4\xf6\x01\x9b\xdf\xbf,\x9eZFZ\x18\xb6?6\x16\xe0\xcb8\x94\xf3?\x81+\x05\x0eJ`\x07@\x04&\x9e$i\x7f\xfc?AZ\x12^=-\xeb?M\xd7\'`\xde\x93\xf7?\x15?\xbd\xb2p\xc4\xdf\xbf\xa4CK\x12\x0f?\xea\xbf\xac\x83\xebo\x1a\xed\x95\xbf\x0c/\x04\xd0\xa9\x04\xc8\xbf\x8b\xeby\xcb\xbaw\xf8?\x8e\x84\xf3r\xb3\xeb\xbf?\xb5&\xc6\x0f\xd9\x1f\xca?\x8b\xe3\x1b\xd0\xab\xfb\x9c?T\x85\xec\xd2\xd8\xb8\xf3?\xba\x04\x0c@\xddu\xf0?$b\xab%\x00\xf3\xd2\xbf\xc0~~\x0f\xc2r\xdd?\x96\x99\x82B\x863V? @\xa5\xe2\xd2\t\xe6?\x14\xbb*\xcf)\xb5\xd3?\xfeJ\x02\xcf\xda?\x11@\x99\xbdx\x95\x1d\x8d\x14@\xa3V&\xed\xc7+\x05@w\x8b&\x112\x0c\x07@\\\xd4\xe3a\x93\xd4\x0c@\xbe\xf3\xfej\xe3V\x15@=\xd0,\xf7\xf3\xf6\xf2?\x99\x9f\xd9."\xbc\x01@\xfb\x82\xbb\x8e_[\xf1?\x17\x12:\\\x9eB\xf6?\x981\xf5z\x11\xe2\x03@o-\x8d\xa6\xd4#\x05@#\x0c`~\xd6\xc1\xe8\xbf\xd74\\\xb1\x1f\xc1\xce?\xc2\xccH*X\x8f\xe2\xbfC;\r\x12nw\xcf?e\xa6\xe4\xfd\x07\xe1\xf7\xbf\xb6\xfc\xea \xa9\xb7\xca\xbf\xfdyJ\xa0\xc6\x01\xf5?\xd8+\x97\xde\x1b$\xf3?\'\xcd\xe3\x13\x00\xe6\x02@\xc2\x8b\xf5\xe8\x1f*\x03@\x80\x04\x84\r\x87\xb8\x00@K\xc4\x12\xcb$\x02\xf7?\xc6|{\xa5\x81\x11\x00\xc0\xcd\x9f\xc9}a\x91\x00@\\\xc8\xc7^\xed\xa56?\xa5O\xb0\xa1\xa2J\xe6?\x07\xbe\xf78\xbf\x11\n@\xb0\xc0\x80\xc64\x8d\x02@\xfc\xca\xdb4L\xf5\xfb?\xfdAV\x9eC\xcc\xeb?\x04\xc4\x0b0\x04\xd8\xfa?\x17\xcf\x8f\xef\xf6\x1a\x91?4\xa8)\xf8_\xf5\xfe? \xa8\x8f\xd1?\n\x0b@\xf6\xd7\x84\xcc\xd7\x91\x0b@`\xb0"C.\xbf\xf5?\x96\xee\x8dP\xcd\x7f\xf0?\xb7\xae\xa8\xc7L \xef?M\x00\xf5\xb2\x9cm\xe9?\xa8\xf7~\xa4\xc53\xec?T\xb3#\xbe\xd7\xce\xc0\xbf\x1f\xd8\xb5\xf9[\xb7\x91?N\xac\xff\xa9\x1b=\xec\xbf\x8fg\x01\x87H\x82\xf3?\x01t\xb1\xbbZ#\x0b@b\x02\x86\xec\x1c\x1a\x13@\xbd\xe3oxc\x19\x05@\x85\x81\x99\xc43m\xde?`z\x85\x11\xc0\xd0\xe8?\x11\xcay$W\xa9\xd7\xbf\xf8Z\xae\x80?\x16\x05\xc0\xe1-\xb7:\x0c\xe3\xf3?/,\xac\xde\x1d:\x04@.N=l\xf6\x1f\xce?.m<^x\\\xf5?\xbd\xe1\x1dF\x06\xb6\xec?\x12Y\x883\xa8E\xfc?\x1f\xdb\x0c\x0c\xbd\x95\xfe\xbf\x1b\xb9\xfa\x16\x9b0\xfb?\x0e\x0eDei}\xd3\xbf\xf0\x80\xd1db\x1c\xf3?Zv\xa8\xd9\x13\xb9\xf5?\xe3\x06<\x91"\xef\x02@\x03\x94\x14\x02\xb8\xbe\x01@\xf2\xc2\xf1Y\x7f\x8e\x03@wE\xad\xa2\xaa~\xde?\xa6\x1c%\x0b\xec7\xdd?4m\\\x12\xbe\xac\xa6\xbf\xfc\x83\x94S\x97\xaa\xef\xbf\xdag+\x8e\xca\x80\xea?\xf4\x9awx\xb9\xdf\xf0\xbf\x1d\xb0N6\xc8\x1f\xe2?\x06\xba9\xe4\xd5v\xfb?\x9e\x81|\x18\xc4\xbf\x10@V\xd0\xe0\xb0\x96\xa9\xee?cl\xcb\xbb7\xd4\xea\xbf\xf7\x99QG\x00}\xfe\xbf\xb8\x19\x0c\xfes\x98\xe8\xbfI\xfa\x1e\xceM\x1b\xf5\xbf\x80\x96\x06\xe4\xdd\x91\x08@\xc40\x85\xde\xb4\x07\xd7\xbf\xde^}\xf3\xe8[\x0e@\xfaR>\xc2$\xb2\xfa?b\x83\xeeQ\x8a\xd5\x07@\xdf\xddm\'OZ\x05@9q\xe2Gq\xeb\xf1?\xfe"\xef\x9cHr\xfe?ho\xc1\x1f\xce\x95\x05\xc0\x85\x911Yg\x12\xd6\xbf\x00*\xac~\x14\xb5\xbd?op\xc7\xe2)\x88\xea?\\\xbd\xc4n\xc7\xd6\xfa?\x0c\xb7\xbb\'\xf2X\xdb?r)\xb9\x94\xc8\xef\xe3?\xbbn\xe9\x80u\xdf\xf8?v\x83\xb0\xad\xd7\x80\xcb\xbf\x9cW\xeb\x0e\x95\xea\xc3?\xefs\x9a\'8\x15\xf1\xbf\xb9\xd8\xea\xf4\xb4@\xe2\xbfi\xd6\x83\x91\xbe\x93\xd2\xbf\xc1\xa8\xfe=\x05\xe3\x07@\x16B\xa0\xa8\xf0\r\x05@.X\xae\xfftQ\xde?#\xf4\xf8\xe0\x8b\xb9\xf4?\x7f\x18\x15\xc5\xd5\xf6\xe3?`\xc3\xca\x86Y\xb9\xcd\xbf\xf0=\xf8G\xcba\xf1\xbf\xfd\xa9Q?\xad\x85\x02@\nrd\xc4j=\xf4?X#z\xc6~3\xc5\xbf?\xa6\xcfsm~\xa1?\xf7B\xd3\xbf\xd2\xe0\xf7?D7\xf9\x080]\xf6?\'U\xb8\xd9Ve\xf7?\xfb\xd8\xf9\xc7$v\xcd?\xe1t@\n\x16\xd1\x10\xc0/y\xe1\xda\xf7"\xf7\xbfo\x8e\xbd\x82\xcc\xb6\xdb\xbf\x82\xe8\xe9e\x15\x06\xf1\xbf\xffxs2g\x8f\xa2\xbfoXf~\x1e[\xe9\xbf\x9d\xa5\x98L\xafL\xa5?\x13\x84y]\xf5\xfb\xe2\xbf\x8b\xe2\xc0\xde\xb3\x99\xe7?c\x05\xa9\xe8O\xa2\xdd?\x990#\xad\x14Y\xe9?\x89\xc7/\xf5\x12\xc0\xe1?\xd6\\w\xda\xb3\x17\xe3?s\xdc\xff\xbe\xd1z\xf1?\x03q\xf6h\xa1\xee\x01\xc0YL\x1a\xc8~\xfb\x04\xc0"\x04\x1d\xbd\x88\x15\xf0\xbf\xc3\x91\x96Z@~\xe5?=\x02wU\xa5\x19\xf9\xbf\x9c\xe2.\xdaw\xed\xf8\xbf1]\xc8t\\\t\xf4?\xea\xfe\xf5.\xce\x7f\xd7\xbf\x04o\x96\xa7\x89\xf3\xc1\xbf7\xba\xbd\x8b\xff\xa0\xe4?\x97\xd3\xa6\x15\x80-\x07\xc0Jp\xc5oc\x17\xfa\xbf=\xe8YN\x90\xac\xec\xbf\xd2\x9e\xb0\x19s%\xf3\xbfEy\x9c\xdf\xd7\xd9\x04\xc0\xa2\x1e\x7fs\x1c \xf7\xbf\xb1\x85\xfcwTi\xf3\xbf\x18&P\x82|:\x00\xc0\x9b6i\xe7\xba%\xda\xbf\xca\xb4\xc0\x89\xe3\x1e\xe5\xbfF\xef`\x8d\xdb\x1c\xec?\x19I5D$\xb2\xd0?n0\x9c\x0e\x89\x9f\xd4\xbf\xf7Dfg7F\xe3\xbfOFP\xc7\xb2\x0e\xdd?%\x82K\xc6\x8b\x02\xd1\xbf}1\xa5\x1e-\x85\xeb\xbf\xde\x85Y\xf9;\xe9\xb7\xbf\x14\x9c&\xa7\xca\x17\x08\xc0q\x1d\x10\x03\x17\x13\x07\xc0\x80\x97\xb1"Rh\x01\xc0\xd6h(ko0\x13\xc0\xac\xaal\xd8\xd9y\xe2\xbf\xdc\x16\x1cn\xb5_\xf6\xbf\xef_\x0e)\xbb\x06\x04\xc0J\x04~^\xfc-\x12\xc00\xf2a\x18\x97D\xff\xbf\x8a\x000\xb9\x94\xa9\x0b\xc0V7\xcb\x05V\xfb\xe7\xbfGryM\x8bE\xfa\xbfYQ\xbc\'\xd0:\x00\xc0\xe9\xadX\xe7\xc2)\xe5\xbf:$N3\xa1-\xe4?\xfa\xbd\xc0w:\x91\xe9?dU\xdc\x97\xb4Q\x01\xc0\xebM\x01\xecC`\xf8\xbf=N\x1f\xb2\t\x11\x03\xc0Y\xa6\xd3`J\xc1\xf7\xbfL\xa4u}{C\xe0?\xa9\x1a\x164\xf6?\xe6?\xa8\xa8,Z\x17\x9d\xf1?\xa7\xe4\xc4e\xbe\x92\xd4\xbf\xb1\xd3\x80\x0c\xe9A\xf5\xbf\xc5\x8a\nh\x996\xf6?Ch\x8a[_\x83\xe4\xbf\x02\xd8\xc7$\xbc{\xee\xbf\xf2f{/\xf8-\x08\xc0\xb5\xd8\x1a\xcd\x95\xaa\x0b\xc0&z\x8a\x01\x0c\x0b\x03\xc0\xd7\xa7/\xa9\xce.\x01\xc02\x8f\x1d\xc3[\xbc\xf5\xbfz;\xf0\x18\x96\xe9\xfa\xbf\xfb\xae+h\x89c\x00\xc0\xc6\xf8|\xbbo9\xe9\xbfn\xa8\xf5\xf5\x19\xac\x06\xc0,T\x8ei">\xfe\xbfK\xaf\xd1:S@\x07\xc00\xf4il\x0f`\xf9\xbf\xf3\xa2%cS@\xed\xbf\x9aI8N\'\x18\xea?\xe4A_J#\x05\x03\xc0\x04\xd3\xbe9#\xae\xff?\xafmk\x95\x89(\xe2\xbf\xcf\x1a\xeck\xf8\xee\xfe\xbf\x1f\x0c\x075\xa0I\x08\xc0\xd7]p/!\x89\x04\xc0P\xfd\xc5\xe3)\x86\xec?\xc9 ;BVZ\xa1\xbf\xe8\xf6$\x91%\xd7\xd8\xbf\x9eA\xf9ot\x9c\xe9?\xe0cmc\xecq\xee\xbf$|-/=\x85\xc2\xbf\xb0\xed\xc5\x85\x8a\x06\xe2?Q?\xf8x7\x0c\x97?\xb0[q\xa3\x1c$\xcd?\x18N\x89\xc5\x19%\xf9\xbf\xfe\xa1\xb9c\xe9M\x05\xc0\xe8\x03\xack:\xa5\x04\xc0\xbbb\x990H+\xdd\xbf\xf6b\x90:\x00\x14\xf1\xbf\xef\xcc\xd73\xe2\xe9\x94\xbf<\xe7\xca\x81\xac\xce\xec\xbfjA\xdc7u\xf7\xe7?rNX\x87\x88\x8d\xbd?v|\xc9\xd2O\x80\xfa?q\x98s\x90\x1c\x06\xd9\xbf\xb7\x0e\xad[q\x8b\xd1\xbfP*\xe5\x07}\xa4t\xbf\x10\x94\xc0O-\xfc\xff?\x06\xd5"\xc2\xd1\xb8\xe2?\xea\x82\xa3\xf9@\x90\xe7\xbf\x81\'g\x82"\x00\xfd\xbf\x86\xed?,\xe0\x9b\x02\xc0\x9b\x93@\xd9\xc6^\xe4\xbf\x96Ij\x9bc\x85\xd9?J%?\x89\x00P\xd3\xbf\xcc\x89\xdbj\x95_\xe3\xbfI\xc0\x80!?D\xdd?\xb2\xda\xad\x82\xb0I\xe3?\x99\x81gi\xf1\xc6\xed\xbfJw\x01\x05\x9f\x8f\xb1\xbf`fC$\xb3@\xf1\xbf@p\xa1c\xda8\xf4\xbfz\xf59j<\xea\xfd\xbfj\xc0\xb7K\xe2v\x10\xc0\xac\x7f\xafP\r\xd0\x0f\xc0z\x88\xf0@\xadC\x11\xc0\xf8\xe1?\x0b\xb9\xa5\x12\xc0$\xcc\xa1\xacx\xe3\x03\xc0":\xae]\x13\xac\x12\xc0W\xe6-\xdfz\r\x03\xc0\xd5/x\x1a\xf5\x82\r\xc0\x1f\xef(\xb3\xff\xc8\xfa\xbf6\x00n\xe51j\x04\xc0|\xc0\x84z\x94\xda\xfe\xbf\x98\xd3}\xd0*j\x0f\xc0\xde\xc7\xe1\x00\x17e\x00\xc0I\x89xj\x18\xd9\x07\xc0&{\xcc\x13N\xd2\x08\xc0\xdb\xd1C\xee\x80\xbc\x03\xc0E\x94c7B\x90\xf3\xbf\xbf<8~\xb3l\xe4?\xf1iq\xfc\xa4\xce\xe8?\x19\xb9\xa0S`~\xda?\x8f{\x9f\x9dC\x89\xb0?B\xf8\x13\xe2\x0e\xed\xe5\xbf\x9f\x1by\xe9&U\xec?\\\xb39\xcc0J\xa5?fx\x93\xd9\t\x05\xec?d\xd1\x06T\xc5O\xda?l\x80W\xfc\x95\x95\xff\xbf-\xf5G\xb9N#\x04\xc0\xef\xc2\xb3\xfd\xd5\xa6\xf4\xbf\xc2\xf5\x8d\xe2\xed\x95\x07\xc0l\x11\xb2@\xa1}\x0c\xc0E\xbb\xd9\x9c\xd7-\x12\xc0\xb4#\x97\x85\xa9\xf1\x0c\xc0m\xe5\xea\xff\xd1n\x12\xc0\xfc\xea^\xb1\xef\x9a\x14\xc0#\xa5@\x14\xe2\x96\x1b\xc0\x8a\xac\xf2\xf5\x01b\x13\xc0zz\xc4.l\xcf\x10\xc0Tt\x1e\xc1\x18\xd4\x0b\xc0H\xf5Q\xe3\x85\x1d\x0f\xc0\x9d\xa3\xafb\x0bp\x0e\xc0\xf4\xd5D\xc6y{\xf2\xbf\xc6\x14|\x18f]\x01\xc0\xfcG?\x19\x04\x02\xf9\xbf\xd3\x85\x84\x04\x9f\xd3\xf2?]15\x8e\x8c\x03\xbf\xbf\xdeOyq3\xd0\xc1\xbf\xba\x06f\xecdH\xe0\xbf\x05\x93\xd2}m>\xd2?\x19\xef\x1f\xdc}\xaf\xe0?\x0b\xbc\x88\xe3\x98\xe5\xda?\xd4\xdf\x9c\x9f\xa32\xdc\xbfx\xb8\xa0\xb0\x92\xc3\x9f\xbf\xbe\xb4\x94\xeb\x87C\xfa?0\xfe\x0e\xaef\xec\xf3?\xd6\xb1\xe2e\x9e\xc8\xf2\xbf\xd5o \xf8\xef\xc0\xe5\xbf\xf8*D\'\x9b\xbd\xe8?\xd4\x07L\x1a\xd8\x0c\xf0\xbf\x97nh\xcb\xfd#\x99\xbf\xaeP\x80\x06\x9b\xae\xd5\xbf\xac\xd1\x0f#\x01\xa2\xfd\xbf\xeb\xad\xc0\xfe) \xe7\xbf<\xba\xa4C4\x1a\xf1\xbf\xdfa\x19\xe3l0\xe2\xbf\xdd\xd2\xd0\x01\xb5i\xf2?\xe8u\xcc\x1e\x86\x8a\xac\xbf87\xd6\xf4\x84<\xe9\xbf\x9dMB\xb2\xd2\xa9\xf7\xbf\xc8\x04\xd9\xfd\x8d_\xb8\xbf\xc9\x87/\xd0\xbf&\xa6Hi\xc8\x1e\xde\xbf\xfd\x83\xc9\x94\xe6\xd6\xdb?\x04\x1a+S\xd2\xf9\xc0?-\xc9b\xcc\xaf^y?\x164#\x83\xc2g\xe8?\xecR\x8b\x16\x1fv\xf1?\x97I\xad\xa0\x87\xdb\xe6?\x1e\xc0\x8b}R&\xe6\xbf\xca\x1c\x85[\xde\xf0\xdc?\xfd\x83\x00\xae\x190\xe0\xbf1\x92\xf8\xc4\xc0?\xe6?\xe1+\x90\xc8\xdap\xd2?g,\x18\x01\xb9\xf7\xf1?\xc5@\x9b\xad0E\xd0?L`\x9b\x95\x18=\xda?\xaf\x8d&\x17\xa3B\xf2\xbftM\xd0\xed\xc9\xf2\x9a\xbf\xc6(\xe7\xd8\x17\x87\x95\xbf1t\xbbEe\xfe\xf1?\x14\x89\xfcP\x0c\xed\xf1?\xd5\xa3\xecJ 3\xdc?E\xae\x1bH\xbc\xe3\xc1\xbf\x01\x91\xce3*y\xc0?\xe5\xabR\xfb\xeeQ\xba\xbf\xd2o"\x1dk"\xe6\xbf\x9e\xd7\x16\xf48\x82\xb3\xbfd\xa14$\x11Q\xb3?\xef\xcc18\x8a\xb9\xe2?\x0c\x96\xba=\xe4\xbb\xc0\xbf\xcf\xfd\xfb\xa3S\'\x8d\xbf<\x14\xae\xe4\xd0\xbb\xf2?F\t\xa34@\xd8\xea\xbf\x10\x9b( \x10\xbf\xbb?F\\&\x04K\xfc\xd3\xbf\x8e\xee\x8c\x04Y:\x88\xbf.\xeekP\x1cg\xf5\xbf\x9f\xdf\x81U\xa4\xd6\xdc?\x1c\xfa\xebr\xd1r\xf0\xbf|\xff\x7f\xc8\x86\x99\xe1\xbf\x8d\xfb\xb4\x03\x0b=\xac\xbfk\xf2\x87\xbb\x87\xdc\xc0\xbf\xb3M\xc5oh|\xf3?g\xe9\x8b\xa2eA\xf1?\xf1\xfc\xd2,V\xd6\xd2\xbf\x9d\xcf\xb0D\x84R\xd7\xbf\x89\xf6*\xb9\xa2\xcd\xe5?\x81wt\xf2\xc7\x8c\xfa?\xf7\xe4*\x93\x93\xbb\xf2?\x9e\xc8|%h/\xb6?\x03]\xc5\xff\xc6\xed\xfc?\xd7\xeb`\xfcSN\xd0?g\x93\xc7n\x18\x9e\xe9\xbfK\xe7N\xbeh\xfc\xf1\xbf\x90\xaf\xf2\xcdi4\xea?\xdc\xef5A\x10\xce\xc8?\x1a\x0c\xac\xb4\xd7B\xde\xbf%\xb94\xc2N\xe8\xbd\xbf^\x9bKT\x0e\x15\xe2\xbfY\xc7O\xd3\xb8C\xdb\xbf\n3\x9a\xb4l\xda\xf1?\xdc\xa9\x1fh\xa1,\xcf?k\xee\xd7\x90g\xea\xf2?5O\xa8\x89\x05\x80\xf0?\xc9i\x1d\xbb\x08\x1e\xe3\xbf\x95v8J\x94|\xe1?)\'\xe7\xea \x9c\xfb?Qu\xe9\xb4\xe6\xa7\xe6\xbf@\x93\xf1e\xb4\xa4\xf3\xbf\xa8&4\xa7^L\xee?\x14;|\xbb\x1c\xba\xa5?b\x8c\x89O\x9e(\xfa\xbfu\x18u\x02\xaav\xda\xbf\x08js\xa4\x02u\xf6?\xae\x82\x82\x83\xfe\x85\xcf?\x84\xfeyF\xe9V\xc4\xbf\x1d`\xf1\x1f8\x93\x01@\xcc\xac\xad\xcbf$\xe1?%`\xddT\x86\x98\xa4\xbf\x82N\xe4\xd4hE\xd6?\xed=\xea\xb8\x18\x13\xd4?\xcbjN\x8b\xf4\xdf\xef?\xacR\xd0\xd4d\x9b\xd3?\xe8\xf3} *\xe7\xe5\xbf+-\xc4\x9c\xf0{\xda?\x11vs\x02\xc6\xfc\xc4\xbfL\x0f\xc8\xe4^\x8c\xc8?16(\xa0\x8c\xc0\xde\xbfEq&\xb9\x97\x1a\xbd?O\xae\x8di8/\xda\xbf\x83\xd7K\xa3\x89\xaf\xf6\xbf\x0e\x97m\xe1\'l\xd7?\x12\xf4kb2I\xab\xbf\x89\xfd\x0b\xeb6\xcb\xcc\xbf\xec\xcf\x0b\xad`\x95\xd2\xbf\x1c\x10\xd8\xbcKN\xf4?p#\xd3\xdcj\xa1\xec?Q\xd0MC\xb7\xac\xf1\xbfVDJ\x8d\xb7\x07\x04\xc0^\xf6\xeb\xc0\xcb\x14\xe7?\xae\x8e\xb6\xcd[\x85\xc0\xbf\xfcV\xc6E9W\xfb?\x17^\x16\xcc&w\xd0?\xb2\x8eJC\xf4C\xc1\xbf\xd6\xd1yj\x04\x06\xe8\xbf\xca\x1d43\xad#\xfe\xbf-k\x1b\xb7\xc0\xf8\xed?e>\xcf\x1a\xc1\x03\x08@PH{\xc8[\t\xfd?\xc0\xceiNY\x9a\xf2?\xac-\xa04\xf6\x7f\xe0?\x15\xa8\x8d\n\x1a_\xe2?\xbdQpz\x8av\xe6?\x8e\xad\xa4}f\x18\xd1\xbf8\xa0\xea\xc4\x92\xbd\xd2\xbf\x00\xbd6\xf7\xe0a\xc6?L\x9c\xa3\xea\xd5:\xc2?CE\x89\xabkE\xa4?\xce];\xdf\x90\x94\xf3?\xc0rs\x97}e\xaa?\x8edS\xc9N\xfd\xe5?\x81\xb0I\xf8\xf1t\xe2\xbf\xb17Z\xdb\x05\'\xdc?\xcf\x86\xfc\xfa\x0c\xe6\xd0?\x96\xdat\xa4\x83Y\xe5\xbfVX\x96\xc9\xef:\xfa\xbf\xc5\xd9\x9d\xfb\xbaL\x00\xc0\\OFx\xe8\x8b\xfa\xbf\xdbu\x08\xd9\xaa4\x06\xc0\x02\x88\xe4Z\xf3\x08\xe7\xbfC\x03\xf76X?\xf9\xbf\xf5\xd6\xcb\x85\xb5\x90\xff\xbf\xb3i\xba\xb1\x06\x07\xe0?\x9c\x965\xff\xb7H\xcb\xbfx\xb4\x9b\xfcl\xdd\xdf\xbf\xb8\xdb\x8d\x06_I\xe6?\x06\x11\xea\xf3\xa55\xfe?h\xad\xb4\x88\xb8w\xa6\xbfK\x96\x02\xd9\x93A\xf9?\x8e\xe7\xe9Bj\xa7\xf7?,\x15\xa0\xd8\xca\xcd\xe5?w\xc8\xda*\xc6\xda\xec\xbf\xd28\xe39\xaaK\xd6?\x18\xc7\xf8@\xaa:\xe0?\x98\xacQ4\x18\x19\xec?\xb0\x0e\x12\x8e\\k\xb3? \xef\x0eG\xbf\x0b\xcd\xbf\xf1\x865\xcb\xb6a\xc4\xbf\x81\xe9q\x85\xbf\x88\xd9\xbf\xaa\xf6N>\xb8D\xd4\xbf\xee\xe9\xaa\x85\x14\xab\xf5\xbfc\xdd(\xe5\x9f\x99\xe1?\xa7#l\xafR\xb5\x05\xc0\xb2\xf0DU~\xd7\xf9\xbf\x7f\x0el]\xf7N\xda\xbf\xf1\xb5\x9e\xd8\xcc\x8a\x05\xc0\x14\x14\xd5\xeb\xc6B\xf6\xbf~\xc1#\xdc\xd4h\x00\xc0\xc5\xa6\xa1*M\x1b\x11\xc0\xd1\xb5z\'[\\\xeb\xbf\x1a\xd6\x08\xd5:\xda\x06\xc0\x89\xb6\x17\xa0\x96!\x06\xc0J\xae\r\xca\xc4\x12\xda\xbf\xcaY#)\xee\xd2\xe6\xbf\xbaa\x19\xc5\xd6\xa1\xed?\xed3\xdb\xdf\xa8\xa2\x00@\xe1\xec\x99\xe96\x9c\x07@#\xfbD\x88\x0e\xb6\xe1?x`\x97\xd6{q\xd9?\x02\x15\xf2kK\xfd\xfb\xbf\xc9q\xdd\xbc\xa0\n\xcd?wj\xa5\xec\x96\x95\xdf?\x94a\xf4\xf3i]\xe7?M\xe3\x9fK\x02%\xdf\xbf\x17\x1dQ\xcc\xb6)\xcd\xbf]\x9f^Q\xa2\xbc\xe5\xbf\xe7i\x9f\\\x02\xcc\xac\xbf\xfa\x08m\x05\xfa\xd8\xd9?\xe6\xba\xb2>\xee\xeb\x00\xc09\x00I`\x81Y\x04\xc0\xb25\x98\x85\x0b\xbe\t\xc0\xb0\x7f\x1fa\x06\x0b\xfe\xbf\xc3|B\xfc\xb5&\x06\xc0\xf2)\x92\xfc\n\x16\x06\xc0#\xdf\xee<\xee\xb5\xe9\xbf\xe2\xe93\xe1b2\xd1?\x92\xc4v\xe0\xfc\xfe\x81\xbf\xf5D\\\xbff\xae\xf7\xbfx3z\x83\xed(\xe5\xbf\xdc\x02M\xd9\r\x9e\xf0\xbf\\\x83\x15Q7u\xcd?\x88\x00D\xb7\xd2\xc3\xf6\xbf\x194A\x8dj\xaa7?\xdf5\xf0\xf4\xf2z\xf5\xbfx\xfb!yF3\xe6\xbftH\x9a\xf2t\xaf\xe6?\xa0\xbd\xfa~<\x0f\xf7\xbf\x0e\xf8\xcb\x9a A\xd8\xbf\x94+g\xa5t\n\xe8?F\xb1\x0cJ\xa2\n\xee\xbf\xdf\x8eD/z\xb2\xf0\xbfm\xa9\xa1\x12\xd3\xff\xba\xbf\t1\x86\x9dl6\xe8\xbf\x1b\xdd\x11q\x07\xc0\xc0\xbfQB\xa7\xdf8\x82\xfa\xbf#\x9f\xa8\x9a K\n\xc0A\xfc\x90.\x90\x13\x08\xc0\xf0\x8eX\x0b?m\x02\xc0=\x8ac\xde\xa1\\\xf4\xbf6\xb8M\xc1m@\xfa\xbf\x85\xc0N\x00D\xd2\x03\xc0X\xce8\x95\xc5h\xee\xbf\xea:g\xcd\x82\x99\xef\xbf0\x15\xcbPh\x0f\xfb\xbf\xcf\xe4\xac+\x02\xfc\x02@\xd2nM\x19m\xc5\xec\xbf\x03\xb7E\xfd\x98\x9f\xca?\xa5\x1fR\xd3\x1e\xe0\xe0\xbfx\x8dwh\x16\xb0\xd0\xbf\xce\xca\xf5Z \xf2\xe8?\xb80\xe2^\xa15\xe6\xbf5o\xda\xd1\xc3a\xbb?\x16j\x8f\x17\xe5\xab\x00\xc0\x07\x1cmnUn\xf1?\xed\x04\xd8\x93$\x1c\xec?\xbb\xab6mmd\xa5\xbfq\xac$\xde\xc5\x1e\xfb\xbfk@\x14\xe7\x9e\x96\xde\xbf\x04\xb3\xc8\r\xf3V\xc8?\xb0\xd4\xd9\xe2\xf8B\xd1\xbf\xc0\xfc1\xdf\xee\xae\xd1\xbf\xda@=\xd4\xcd\\\xfc\xbf\xbb\xdb\x00^rP\x00\xc0U\xeb\xacL46\xfc\xbf\xd3+\x8b\xf2\xb4\x99\x04\xc0\xa9S=F\xed\xf2\x0b\xc0x`+\xe1\x93\xba\x01\xc0l\x90\x00\xb1\xae\xbb\xf5\xbf\xbeL\x06\xe4sf\xe6\xbfG\xcc\x1a\xe8\xb9\xe3\xfd\xbfZ%\xa6\x0b{K\x03\xc0\xb45\x93m\xfa\r\xed\xbfwXi\x11\xbaH\xe9?E\t-\xda\x03\xe2\xb9?Q\xc4y\xa9\xcf\xb1\xef\xbf\'+\x9byQl\xd4?m\xf3\xc7\x93\xfbp\xf0?\xfd\x1f\xb8#\x18/\xe6\xbf\xc3;9\x13\xed\xfd\xe8\xbf\xb5\xcbQ\xc3\xe7\x02\xf7\xbf\x89V\xc2\x91\xd1(\xfc\xbf\xf0\xc4\xd9\xc4\xf1\xec\xfc\xbfj\x1c\xfa\xe0\x9aZ\xf0\xbf6\xe8r7\x10\x17\xf1\xbf\x13\xff\x9f\xcd^h\xf9\xbf}q\xda\'\xd3z\xf2\xbf\x12_;\xc0W\x95\xe2\xbf2\xd3;\xed*M\xdf?P\xdav\xe5\x87\xa1\xd0?\xd2\'#\xf4\xa8\x8f\xf8\xbf\x9b\x02c~\xd5\x95\x14\xc0\xc7$\x9a\x80\xc0\x11\x12\xc0\xd1p\x1a-)\xa0\xc7\xbfFA\xf6\xe2q\xeb\xf6\xbf-\x10C\x88\xe7]q?8\xef\xe1\xc3K\x96\xf9\xbf\x95c?\xcdE\xba\x96\xbf?\x18\x8a\xc4\xf3\xcd\xc3?Qq\'\xb3\xa5L\xbd\xbf\x04N\xc5\x9fh\x0b\xe1?`\xf7\xec\xb6W\x18\x06\xc0`\xf1\xcc\x07\\\x14\xf2\xbf\xde\x04{\xb6^\x08\xe3\xbf.\'\xe7\xfc\xefX\xf3\xbf!\x16\xc1\xecTN\xfa\xbfE\xfa<"d~\x02\xc0\x95Yv\xb2\x97\xccy?\xd4\xb7\x80\xb9Bj\xfc\xbf\x9d\xb3d\x86\xca&\x01\xc0\xcb}\xd0\x19\xc6q\x15\xc0\x9e\xfa\x15\x00\x1b\x95\x0c\xc0\xc2\xb1\xc5\x1c\n"\xee\xbf9\xb7\x08\x9a\\\xb3\xe1\xbf\xfdMxQ\t\xf1\xe6?\x99\xedM\xa5\xf9\xbd\xf4?\x9dk\x8elB\x0f\xd5?*\xde\x0ez\xd2\x86\xf4\xbf\xb9\x95O\x9a\xf5\xc2\x04\xc0z\xa3\xe1\x93\xd1\x93\x02\xc0P\xf7?i\xe6\x96\xfc\xbf\xd9\xf1\xe9C\xb1\xcd\xca?\x15\x03t\x15\r\xa0\xd9\xbf\x1cvZ\xf3\xdc\x01\xe4\xbf\xd2 \x11!\xac\xc9\xf6\xbf\xf8\xd3\xedb\x9e%\xd8\xbf\xe6\xd6\x985p\xba\xff\xbf\xd3\x7f0\x9c\xd0L\xa7?\xa3\x19\x03\xb73\xd5\x0b\xc0\xc0\x89\xdaY\x11{\xde\xbf"\x88|\xeb\xf3F\xe7?\xb2+\xdc0\x08\xcc\x08\xc0\x8c\x07\xdch\xb5\xd4\x06\xc0Z\x14\x05\x95\x82\xae\xe5\xbf$\xa6\xc1\x8e3 \xda\xbf\x11M[\xb0\x0c\xb9\xff\xbf\xe3@B\xf8D\x9d\xf0\xbf\x1aI\xca*\xbd#\xef\xbf \xc9\xbdj\xc7\xf7\x0f\xc07\'X\xb2\x8am\n\xc0A\xde\xf4\x16\x01\xa0\xfa\xbf\x15W\x818\xf9\xc2\xe5\xbfR\n/\xd99^\xe7\xbfY\x99\x10\x0e,\xa9\x83?D\xe2\xec7\xdeq\xdb\xbf\x06[\x8a\x8aP\xce\xb9\xbf\x163\xc9Z\x98\x8d\xf3\xbf\x13vx\x83\xe2\x7f\x00\xc0Zd8\x98\rZ\xf5\xbf\xe6\x8bm\x8dl\xf1\xd0\xbf4\xc9\xcb+\xcd\x95\xf0\xbfPhy\x01Q\xd3\xcf?{K2\xce\x085\xfc\xbf\xdaw3p\xa5\xe1\xe8\xbfE\x16%%\xd4n\x03\xc0w\xbd\xc4\xa6\x1f\x8e\xca?\x19[\\\xeah\x1c\xdd\xbf\xe6\xccB\x02\xb9}\xd1?\xea&\xc0z\xee\xd0\xed?\x1a\x9d[\x04\'\x15\xc8?\x9fP\xe6&c\xef\xe7\xbfM\xe1\xdc\xb9\xbc\xb7\xf2\xbf\xc1jY\xfc?\xd9\xd5\xbf\xdfdy\x8b9\xb1\xfd\xbf\x99\xd4\x89\x85\x15\x10\xf3\xbf\x17Uu\xf74\xf5\x02@uIuG\xae<\xdf\xbf\xea\xec \xf2<\xab\xf7\xbf/C0+YC\xfe\xbf\xfd\x0f-\xbbHw\xe4\xbf^a\xc4\xdc\xb4\x11\xd1?\t{p\xee6\x9c\xe6?\xce\xc7\x01\xa0\xb7w\xe6\xbf\xf3Se\x8d\xc7s\xf2\xbf\x14\xc99\x95\x95F\xdb\xbfd,\xb9\xea\x08\xa7\xe2\xbf\xb3\xc8\xb8\x03ef\xa2\xbf&\x14\xf4[\xf4\x11\x0e@:\xab}\xe7?\x85\x01@\xa6\x8f\xc7\xf6!\xde\x04@!t"?\x8dI\t@\x9e\xe1\xf9\xfb\x18\xdc\xeb?\x8a\xed\x0c\x06\xdf\xb4\xa8?\xc8\xfc);=}\xf3?\xb6\x16P\xc4\x92@\xfa?I\xb1\x868\xf3\xac\x08@\x0c5\xfb\x13\xaeg\x04@6\x8d\x1c\xc2\xf1d\xcd\xbf\xdc\xe2|\x13\x8d\xc4\x02\xc0D\xa3o\xdbF$\xd0\xbf\xff~\x96\x08:W\xc8\xbf\t\xb2\xb2\xfc\xa4\x86\xd2?\xa91]\xe1\xcfk\xe7\xbf\xb1\xdb\xbb\xd9\xd6\xdb\xf3\xbf\xbf\xdf{\xd0\xe45\x00@|\xe0(0\x82D\x00\xc0R\xb7\xb4\xf1]G\xf5\xbfH\xce\xfc\xb5E\xebc\x84\xfe?\x85p}^*y\xd8\xbf\rr#-V \xb0\xbf\xed\x88\xcf\xee\xd7&\xfe\xbf-\xfa[2+\x83\x00\xc0z:\xba\x03T\x13\xca\xbf\xb1\xe6\x849(j\xf2?\x15z,\\\xe0}\xf0\xbf\x88\xdd\xb1\xc0\x06r\xcb\xbf\x8ds\x95\xa5\xe9\x0b\xd7\xbf\x8d]\x04i\x98\xe2\xed\xbf\x86`\xb3\xa8\xfd\xe8\xec?\xe4\xb8\xe6/\xce\x1a\x03@\xfa\xf9\xad#\xbbn\x84\xbf\xd5\x81=^!U\xf7?>\xdf\xd1\x08^\x1c\xe9\xbf\xf7\xcd\xdf\x83\x93\xcf\xcc\xbf\xf7\xa2f\x86\xc3\x1a\x05@\xc3\xb7,9\xb6Q\xf5\xbf7\xe7d\xb2\x16f\xff?NG\xf3h6^\xf9?i\x04\x82\x93\xde\xed\xce\xbf\x08\x15\x86G\x993\xc7?j\xb1KQ\xc0\xc5\xe1?d\xedI\xb4\xe9\xaa\xeb\xbf\xe2\xe0\xad\xd2\xce\xf9\xf9\xbf,C\xfc%\n\xb8\x00\xc0Y\xac\xf1i2\x15\xc9?~\xa0\xb4jqh\xfb?\x1b\x06w5E\xb7\t\xc06M\xf1\xa6\xf7\xc4\x10\xc0\xfc\x95\xd4A\x90G\x05\xc0\xa4\xf5\\\x18\xf6\x15\x00\xc0a\xcf\x8d\xfe\xed\x11\xe8\xbf+\x17\x93\xba\xf1\xab\xea\xbf\x92H\xc1\xbb\xecJ\xe6?\x96\x81\x92.1\x0b\xe1\xbf"\xcd\xbc\x15\x0b9\xeb\xbf\xd16l\xf0V\xaf\x04\xc0Q\x00%\x17\xc2\xc5\x0c\xc0\xe0chP*1\x04@\xba\x0b\x87\xa4\xe6)\x11@\x1a\xc9\xe1\x9c\x7f)\xe9?\xc8\xb3\x8c\xb3\xec:\xd4\xbf\x0f\xe4\xc6I\x8d\xd6\xfa?b\xca\x92\x93\x8cq\xfc?\x8f\xbb\x85j!\x04\xf4?\xa0~4\xda\xa0Z\xb0\xbf\x19\ru\x9d3D\xef?O\xb1\x9f\xce\xf77\xf4?&\xc9\xe2\x9aX\xc9\xe1\xbf^\x08\xb6\x04cL\xdf\xbf\xad\xa4\xdf\xcaT\xab\xdc?UU\x8e\rs\xdf\xec?\xc2\x96\xbc~K`\xd4\xbf\xa4A\x12\x93\\q\xb8\xbf\xd6m\xc1\x99-\x9c\xff\xbf\x1d\x9d\xff8,\x97\x06\xc0\xf9\x8293Y\x17\x11\xc0Q\xd6\x8d:\xc4\x0c\xf9\xbf\x8f\xe6[t\xd5V\xf8\xbf\xe0\x16\xe7\xf9\x16\xbf\xed?=\xbe\x0c6&\xa0\xe1\xbf\xd1\xd0\xf9i.\xf9\xf7\xbfV3\x9a^\xe3\x06\xc1?&\xfeA\xc4\x92,\xdd\xbf\xd8\xce\xb6\x00k3\x08\xc06\xd3m\x1e\xa2b\x0f\xc0\x8b\x97\x90~\x04\xc5\xfd\xbf\xa0\xcf\xb9\xa4s+\xf2?/\xd8\xbb\xb0Ff\x03@]K\xcf\xf9\xe0y\x0e@\xcf\xff\x162\x81\xc8\xee?O\xbf\x8ePp\x14\xd5?0( \x80No\x9d\xbf0\xc75\x9ev\x7f\xe5?a\xeb\xb7\x18?\xa8\xfd?\xb8\x18\x8f\xb8\xc1\xee\xa8?o.sZ\x94\xb4\x01@^>\xf2\xcd\xd20\x01\xc0Z.\xbck\x08v\x01@])\x82\xdf\x94\xe9\xca?\x19I\xc2\x82\xd0\xd3\xe6\xbf\x1a\xf6\xeb\xb9\xa7\xd8\x04@\xc5\xf4L\tW/\xf8\xbf\xe8\x0b\x98\x07?\x02\t\xc0\xf3U\xa8\xc0\x96\xd6\x00\xc0\xd8\xecX\x05+\x13\xa0\xbf\x85`A\xf2\xe7\xa3\xf7?i"/ir\x1c\xd7?\x80\xd6\x83\xed{0\xc5?\xae\xb3\xa4\xc8\x88\xbc\xed\xbfts\xd5\x95l~\xcd?j\xcb\x84k\xdcE\xed\xbf\xbc\x06\xfe\xb5\x92<\x12\xc0s\xba\x1d\xbd\x81\x13\x0f\xc0\xf6\xea\x99\xfb\xcb\x18\x15\xc0\xfdHN\x89\x96s\x00\xc0\'/\x10#\x8c\xe9\xe1\xbf\x11[\xfc *\xe2\xfe\xbf\xa8I\xc9\xd7\n\xd0\xf3\xbf1^^\xa2\x175\xea?\xa7cv\x1b\xf6y\xe0?\xe8\n!\x9c\x80\x9b\x00@\xdc\x1f\xa1~\xf4d\xd3\xbf\xfc;\xfe,-n\xd2?\x17\xed\xeb\xce/U\xe8?@8\xba\x00\x1fS\xff\xbfS\xed\x95G\x17Y\xcb?{eK{\x00J\xeb\xbf_IY\xf4\x01\x81\xe7?\xd1\x82\xc8\xb8\xc3\xa7\xd9\xbfa\xcde\xaf\xeb\xf6\xe5\xbfS1\xff\xf1\x8al\x04\xc0\xeb\x06\xb0\x11\xc1\x10\xf0\xbf\xed~=\x1b\x9e\xb3\xe8\xbf\x8a\x06c\xbc\xc4\xf4\xff\xbf\xb7\xebn\xa0\xf5\xcd\xed\xbf7\xc9\x18\xff\x91:\xe7?\xc1\xbf\xd3\xa5\x83P\xf3?|\xf6\xd6M\x18\x9d\xf1\xbfw\xe3\xf0\xf5]\xe4\xc9?\x8c8=\x9a\x15G\x06\xc0vB\x98;\xe3:\x07\xc0\x94\xbd\xbed&{\x11\xc0\xccb\x90;\xeb\x16\x14\xc0\x07\x12+j\x02~\x0f\xc0Q\x91;Xn\xc7\xf8\xbf\xe6R\xd6I\xdf6\xe9?\x89\x0f?S\x88\x84\x00@\x9e\xa4D\xec\xdc\xc4\xd7\xbf\xaa\x9a;\x8fYh\xeb\xbf?t\xbc\xa3\xfe\xb2\xda?/\xc8\xb6\xb0\x05\x82\xf2?\xc8\xfa\xc7A3c\xf4?$\x0c\xf5\x97\x1c5\x0c@\xf1\xdb\xd9W?\x06\xc7?\xf2\xe9\xd0{<2\xfb?\\\x01\xb54\xc6\xaf\xf1?\xbe-~\xfej\x18\x02\xc0{\x81\x86\x0e\xf0\xe6\xed\xbf\xcfR\xacy\xe9\x83\xf0\xbf\xec\x12\xdbN\x15\xd8\xfc\xbf^\x9cs\x86I\xc4\xd4\xbff\xa7$\xc7\x08\x14\xd6\xbf}\x0fJ\xe1)S\xe1\xbf#f\x90\x9fe\x13\xdc\xbf\xb1\xaa\x03\x10\xf8B\xf0\xbf\x03\xb9\x12QI5\xe8?M>1\x9b\x19\xd7\xe9\xbf\x13\xb7\xee\xa5\x19\xfc\x01\xc0e\xc1~%s\x12\x04\xc0\xcd\xff\xe9\xf1mK\t\xc0sP\xbf\x0e\xf5\x94\x07\xc0\x14\\\xe69\x9e\x80\xfd\xbfp\xc63\xf6\xe8t\xf6\xbfP;\xc1V\xc4a\xe5\xbf\x1e0v\xec \x81\xd1\xbf9\xbc\x89\x8dK\x8b\xe0?\x89j\x8a\xab\xe6\xc7\xf2\xbfMXE\x99\xfa\xb1\x00@\xd5\xea\xf4\xc7\x85\xbd\xf3\xbf\x84\t.\xfc\xd9\xf1\xbf9N\x04ug(\xec?hV\x089\xc4\xfe\xe9\xbfi\x1d\xb7?U\xbf\xf9?\x15\x82\x1a\x9ci\xc2\x06@L\xae\xfd;\x8f\xbe\xa3?U\xd1*V\xb5\xd1\xf2?\x96\xd8)\x9f\x9dU\xfd?r5>:`\xc7\xf2\xbf\x02\xda\x82\xb3\x98\x1e\xf1\xbf\x8d\xffY"f\xfa\xea?n\x7f\x86Z\xa2u\x05\xc0n\xd2\xf3\xea\x0ey\xf4\xbf;n\xea\xae\x02\xe8\xe3?}wP\xc1=\xae\xfb\xbfCk\x1d\x9c=\n\xda\xbf\xfc`\rC\x87*\xdc\xbfi/\xd0\x02\xde\xad\xda?e\xddA\xad\xean\x07@\xb4#\xbf\xd1\xba\t\xfe?\xe7\xdd\xa9]\xbd\x1d\xb4?\xc4\x06F\xc0t\xfa\xf5?\xf6\xeb\xdf\xf7\xbe\x10\xe1\xbf\xbe\x97\x9c\xad\xb3`\xa9?5j\xc0\x7f3\xd3\xd8\xbf\x04]p\xcd\xbe\xb6\xf0\xbfI\x00\x13\xed\xad\xd4\x99?y\x99\xda\xc1\x1c\xf5\xee\xbf\xa4\x0e\x8c\x93\xe2\xbb\xe7\xbfo\xfd\x85\x1ax\r\xe9?\x02\x9c.>\x8c\xbd\xd5?"\xd6\x1fI\x03\xb1\xda\xbf\xd0\xab\xaa\r\xef6\xe9?\t\xa0A\xcen\xee\xdd\xbf\xdb\xd0\x89\\\xf7\xcc\xbd?q\x11+\xd9\x98\xf2\xea\xbf\xa6\x9a\xb1\xbc\x17\x9c\xe2?\x98\xbf2H\xe9\x0c\xec\xbf\xae\xaa\xf46\xec>\xe9\xbf\xe0L\xa2\x7f\xc1\xac\xff\xbf0\xeb,\x05\xcf1\x00\xc0x\xa7\x0b|\xb5\x97\xff\xbf.\\\xed\x9aP\xee\xe9\xbfK\xb2\xbc}\x89\xf6\xba\xbf\xa4\xf7"\xae\x8c\x16\xf0\xbf\xbcqF!\x16m\xb5?\xa5f\x83ND\xbc\xf7?\x0c[\xab,\xfb\xd9\x01@\x8a)\xc6ahf\xfc?R,R\x87Ad\xf6?[\x86\xb3\xd7tM\xce?\x12D\x00s\xabZ\xd9\xbf\x16\'e\x1br\xfa\xf4?#\x85|\xdf\x8f{\xe8?\x81\xd2\x97gwc\xcd?\x0b\xfbuD\xaeW\xe7\xbf\xad\x98\x83wh\x8a\xfa?\x9e\xe8\x9c\xed8\xfb\xe8\xbf2Db\xe0e\x87\xd8?KrL\xdf+\xe9\xf9?\x9d?\x14\xf0\xb07\xcf\xbfG}AY\x18`\xb2?v\xa1\xedt\x84\x89\xed?N\xc7\x89\x0c@\x8f\xe5\xbf\xca\ty\x9f\xb6_\xd4?\x0c\xb6\xce\xf6\xd2\x0b\xe0?\xc1\x11\xfd\xa5\x07p\xf4\xbf\x8a\x8e\xe6\xbah1\xcb??\x8e]\xce1h\xf3?\x99\x82\xa6\x0c\x11\xab\xf6\xbf\x95s\x80L\xf47\xf5\xbfYe\x1a\xea\xc6\x1b\xdb\xbf\xb2mH\x8f(p\x05\xc0"\xe8@z\xc2\x81\x00\xc0c\x02E_0\x87\xfd?\xe6\x8aF\xc56\xc5\x01@\x9a\xf7\n$\xfd\xb1\xf1?R:\\2\x81\xfe\xd6?\xe6\x13\x95\x8f\x02e\xca?\x10\xf2\xf0}d\x8d\xc4\xbf{\xd9\x89\xb1\xc0Z\xf4?,\xca\xb2\x1b\xa9V\xc7\xbf\x8d\xdb\xd6\xe5{\xbd\xde\xbfYv\xcc0\x97\xc0\xd1?\x89\x93\'\xf4\xb6\xf2\x95?\xbf\x0bQ&\x93\xc1\xec?\xd9z\xbf\x85\rh\xd3?\xba\x19\x82\xc6\xbe\xb2\xdd?\xc0\xf4\x80\xb0\xde\xcd\xb9\xbf\x0f$\x9a\xc34\xc7\xd8?\xbe6_\xc6\xfe\x97\xf2\xbf\x9c\xef\xfe\x9e\x15\xf1p\xbfL\xecWb\xa5\n\xe6\xbfP\xcaK\\O\x96\xc5?\xdd?yW\x9f\xae\xf3?\xe1\xa86\xa7>v\xf8\xbf*V*\xea04\xe3\xbf\nE\xf33\xe6&\x04\xc0\xa2&\x80\x1c\xfav\x11\xc0\x98|\x9a\xf2\'\xde\xec\xbf\x97\xb98m\x13\xe4\xed\xbf\xbc\xd5\x15\xc8\xe6\xca\t\xc0g\x91\x0fWu\xcb\xf3?\xa2\xb3\x0c\xcfA\x11\xb8?\x83\xb4\xcaN6\x89\xa6?WzTh@\xf3\xe3\xbf\xe0-\xbdJ\x8fu\xe8?G\xe8\xae\x1f\x8e\'\xf5?\x9d\x89/-w\x19\xc3\xbf\xa1\xb2@\x18\xfd\xed\xc0\xbf\x80\x90\x1d\xe6\xb5\x96\xc9?\xb0\x05\xac\xd2\xd2\xab\xbf?\x8a\xa1s\xd9~\x17\xd7\xbf\t\xb6\xba"\x06\xe6\xf1?v\x83zE\xf5\x1d\xea\xbf\x91\xe0<\xd6\xe2\x1c\xca\xbfb[\xa0\x17\xba\x13\xd2\xbf9r\xe7\n|\xf0\xf3?\x19\x88\xe2\x89\x83\x05\xdc?\x8b?f\xa6\x04\xed\xd7?\x91\xa5V\x14k\xad\xd6\xbf\x91s(`\\\x88\xe4?h|u\x9el\xcd\xf8?\x89\xc4G\xb8\xcc\x8c\xe6\xbfwC\xbbPZ\xcf\xcf\xbf\xf2r\x99k\x04\\\xa3?\x10\x81\x7f\xdff\xf5\xf1?\x0cm\\\xe5hw\xcf\xbf]%\x85\xfcu\x8c\xe0\xbfI6\xc4\x15\x19n\xcc\xbfc\xbc8\x1b\xa2\xf4\xde?%-\x98c\x1b\xec\xd5?j\xbc?\x9d]\xc1\xe4?q\xc68\xd86\xbc\xe7\xbf1\xc5\xe0\xfa\xf4\x8d\xbf?\xf05\t\xf9Hd\xb9\xbf\xc00\xe8\x05\x86x\xde\xbf\xa9\xf4\xa3\t#J\xf3?8\x01\x1b\x05\xea\x10\xe2?\x03|o\x9a\xb9[\xe0?;\x82\xf7e\x81D\xf0\xbf\xa9P\xa8\x17\xe0T\xc5?<\xa6.\n\t\xfd\xe6?\xc0\xb7\xb7\xcb\\\xda\xe2?h\x07\x11\xf3\x18h\xbc?Z-\xb3[*\xe4\xd9\xbf\xe0\xa8\x12\x9b>(\xb0?\xd3w\xd3Xye\xf0?\xad\xb2\\J\xab!\xaa\xbf8g\xc3@j\x8e\xa6\xbf\xe3p}-yv\xf9\xbf|PT\x0c\xbc&\xba?\x8f\xe9\xc1AK\x05\xdf?\n$+\xec\xf2\x81\xd4?\xa3oU\x1d\x9d\xd8\xcd?D\x8d\xfc/\xb5\xcd\xf4\xbf[@\xe5\x0bk\x0b\xe7\xbf\xf1\x98L):\x01\xb8\xbfA\xcb\xdaU\x16T\xeb\xbf\xa9\xf8\xc3\x8b\xee\xf6\xae\xbf\xca\x91\x87\x11\xf3m\xed\xbf\xaa\xb3\xeb\x82\x8b\x15\xea?X\xbd\xce\x9dDu\xa1\xbf\x97P\x92\xc0\x90\x98\xf1?\x96v\x03\x108\xa0\xd9?:\xd4\x13\xf6[6\xc5\xbf\xa1\xcd\xee\x10\xe0k\xf7\xbf\xc0}\x83E\xf1\x9e\xdf?\xcc\x1e\x0fRl\xbe\xd1\xbfo\x7fD\x1eR\xfa\xc7\xbf\xd8l\x93\xd4\xfaX\xe0\xbf\x0eHt\x91\xb7\xe5\xdf\xbf\xe8\x7f$\xd9\xe5%\xe5\xbf\xf2\x80\x1a\xf1\xb9#\xd3?\x1c3+\x94\xf5\x96\xdb\xbf\xe3\xbb\x82\xd6\xe3\x17\xe8?X(\xb2\xea\xad\xcf\xf7?Y\xa66]\xd2\xac\xe6?\x90\xf0\x08\n`*\xb1?U\x93P\x94\x8e\xc2\x8c?\xe0\xbb_)\xef/\xf5?\x9d\xf6"\x06\x94:\xde?\x83\xd4\xf9(w\xc9\xe2?s\xa3\xd7\x1c\x1d\x9a\xed\xbf;\xb5\xffl\x81\x12\xd6?t\n\xc0!p<\xc6?\xc1\xc3\x83\x80\xf0\xb2\xe4\xbfW\xe61\x9e\x1af\xf0?\xeco\x82\xe1\xe4q\xd0?S\xac\r\xf1\xfaq\xec?\xbc4Wx\xbf\xec\xf6?=\x8cj=/Q\xe4?B\x0eL_\xde;\xf6\xbf\xba\x14\xa3\xbb.\x9f\xe9\xbftv\x98\x8eDm\xcc\xbf\xf6\xb2B\xf6\x05E\xe2?6%}t&\x82\xd1\xbfB\x8c\xda\xa9^\xf8\xcf\xbf-\xeb\x0cm\x88M\xd6\xbf\xab\xc8\x89\xdf%\xe9\xc2?{C\\u\x88\x00\xe7?\xea\xd0\xe0|\x1bf\xeb?\xc7G\xc6\xb2\x1da\xf5?\xff\xdd\xcbGo\x9c\xee?\xbf\xd0v\xdb\xbb\xd4\xe9?e\xf8\x88\xa9\xd3Y\xea?\xbb\x83V)\xa6\xdd\xec?\x98\x13\xc6\xbe\xf4y\xcf?.5\xd0\xb4\xff\xbb\xde\xbf.\x07\x81`\xbb\xef\xe0\xbfd\xdd?`rU\xd8\xbf\xd6SQ\xd59D\xe1\xbf\x86?5\xaaG\x9e\xdf?S%\x88\x9d\xe8\xe2\xd1\xbf\xf5&/\xea1\xda\xe6\xbf\xcc\xe9\xc4%^;\xe9\xbf\\\x8a\xef"\x9b(\xe0\xbf\xb6\x8f\xfc\x9f-\x8a\xe4?\x86q\xc34\xa8\x16\xa2?\xbb)a\xc1+o\xf1?\xac\xb8K\xff\xc1\x03\xf7?\x9cO.\x94N\xec\xed?G\xa6HI -\xfa\xbf|V\xdd\x14#$\xeb?\x7f\xa2\x8e\xdd\xc9\xb3\xfa?\xdc\xe4\x95\xd4\xb1?\x9e4\x8c\xb5\xfd\xca\xe0\xbf\x9d\x92t{j,\xbc\xbf\x84(\xa14/\xb0\xab?\x87\xff\x08\xe2\x9c\xce\xee?\xe2\xda\x00\x94g\xe7\xc7?3\xe7O\xebZ\xb3\xe7?\x02\xf1\x95\xb2\x1e\xe1\xc6?\xb5\xe9\xb1\xb7`"\xea?\x07\xdc\x10\x8aI\x1d\xea?\xd2\xf5\xbf\xc0\xb2\xe5\xde?k)h\x1f2w\xf5?\x93\xba\xc8x[\xc2\x10@\xa4%=\xa4\xa5<\xf6?\x1e\xef\x9cTLn\xfa?\xde\x06l\x046N\x06@\xc1 \r\x9a9\x96\xc3?\xcf\x14*\\E\xe3\xf8?X\xeb\x1f\xb0\x8c|\xf2?\xf2=\x1d\xcd\xac\x00\xfb? {,C{U\xf3?\xcd\xcbD\xe6OD\xe7?o\x0c\x11\xb8\rC\xc0?TT{\x16\xff\xe4\xb7\xbfi.\x98\xfa\xc8I\xe6?R\\\xf9+\xfb\x16\xdf?a\xeb\t0\xfb\xf7\xaa?\xfb\xaf\xee\xae\xb8U\xbf?\x94\x90\xdb\x05[\x97\xce?T\xd5\'\x1cD\x11\xb2\xbf\xdaj\xf3V\x9at\xf0?=Q\xf14\xd5\xba\xd5\xbf\xc0\xa9\xf3\x9c\x85\x1c\xc9\xbf\x02\x1b\xd4d\xae\xaf\xc5?=\xf2\xfa*\x8d\xee\xec?\x02!\t\xfa{|\xfa?\xc0\xe6"|2&\xd5\xbf\x04?z\xd85Z\xf4?+\xaf\xab\xc4\xb5\x12\xf7?\x8a\xe7B\xaf\xdd/\xe6?\x04=Q\x93\xbdY\xcb?{\xd8\xc7dv\xf9\x06@}\xbe\xdc\x05x{\xed\xbfxXY%b\xbc\xf1?\xbbb\r\xed]\xb8\xdc?n\xeb,,}\xc2\xf6?,T\xc6\xce\x11\x89\xe1?7\x05\x03Vk>\xf3?4a\x11:!\xca\xf8?\xea\xb1\xcc.\xa0W\xf5?\xe6\x02\xd5P\x85\xaf\xf8?\xa8\xcd\xacV\x056\xc1\xbfn"\x1cA\xf8\x19\xf0?\x0e\x19\xfb\xfav\xca\xe1?\xe3a\x91\x1f\x99J\xe9\xbf2\x8ea\x06\x8es\xd5\xbf(\x96\xd8\xa17\xc4\x85?\xc6M\x18\xc3\xf4\x16\xba\xbf\x0fJ/\xbbb\x03\xb1\xbf\xda\xb97\xdeov\xe9?\xc7\x9c\xb1\xff\x96\x8e\xa7\xbf\xad\xfa\xf8\xf7M\x0b\xf0?\xf3\x86\x00\xea\xcc]\xf8\xbf\xe7\x04g%J4\xec?S7\x9e~\xab=\xfa?\x81\xd6\x7f\xa4\xf3E\xdc?\xb1^\xbd\xd0{\x84\xb6?\x0e+\x19H\xf5v\xfb\xbf\xd5<\xa1*\xf8\xde\xf9\xbf\x1b~#\xba&\x06\xea\xbf\xa0\xbb\xc7\xb9\xebl\xe9?J\xef\x88\x00\xdc\xa6\xe8?Z\xb7|\x0f\x01\xf1\xe7?\'\'s\xc3\xf0Q\xff?\x04\xe2\xa6\xc5Q\xd1\xf3?\xdf\xc46\xd8\xc0$\xe9?\n\x93\x0f\xd4[\xa4\xec?\xd5\xde%\xa7\x94@\xec\xbf:\x02*\xd3Df\xc2?\xf4\x13\x16\x1eg\xa7\xf4\xbft\x8c\xb1\x99K\x8d\xd0?\x0fG\x1fL\xc6\x1a\xcb?\x86\xedK\xb9C\xf7\x9f?\x12\xe8\x1a\x9b\xb2_\xd4?\xf4\xc7vGE\xbc\xe8?\x1ck\xfd\x1a\x89\xc5\xa4?$:\x0e\x972{\xeb?\xb8\xbcrD\xbe\\\x01@M\xe3(d\x86\xb1\x02@\t\xf2\xaf\x17\rT\xc7?5*\x0b0.\xdd\xb6?\x04T\xee\xff\xbdW\xe7?\xa9\x18]Z\xe1\x1f\xdb\xbf\x04H$\x14B"\xe9\xbf\x0c\x8bp\xf6\xa0\x86\x9d?\xac#\xbf(\x83\x8d\xb5\xbf\xf4O\x8c\x17\'\x96\xc6\xbf\xdd\x89\x9c*\xf3\xcc\xda\xbf\xa6bc\x02\x7f\x82\xb2?\x8a=\xf0\xc15y\xb1?\x02\x14`\xc5\xdd\xe9\xbf\xbf\xd9^C*\x06\x19\xd7\xbf4*\xf2T\x83;\xb0??\xbf\xc4\x95\xec-\xe9\xbf\xe5\xdd\xf6\x87$3\x01@\x02\x00?*/H\xe6\xbf\xc6\xd3X)\xdd\x93\xf3\xbf\xb6d\xa4\xb4\xad.\xca?WG\xd35q[\xf8?\x1d1p\xc3\xec%\xdf?\xe2\x01z\x11\xeeI\xeb?\xde\r\xb0\xf1R\xdc\xdc?j\x10\xb6HhO\xf1\xbf<\xd5|\xa6ER\xd4?\x93\x87\xc2\xa7@\xc7\xa2?94\xdeL\x98\xa0\xf5?c\x90\xae\xc4\t\x82\xec?\xc0\x06\x98!\x7f\xdb\xe3\xbf\xfekw\xfd\xa8[\xfc?\x91\xe9\xc0\xfaSa\xd6?\xf2\xd4/\x9f\x97\xa3\xf4\xbf\x94\xa4\xba\xc3\r\xe5\xe1?,\x8cV\xc3\x19\x9c\xf3\xbf7\xf5\x18\x88.\x14\xe2\xbf\xa2\xbbO\xc1Gl\xc2?\xf8\xbc\xdb\x92\xa9\xfe\xd5\xbf^u\x86=\xa8\xb2\xf2?+\x9f\xef\xba\xcd@\xf4\xbfr!\xddK\xa5<\xf7\xbf\xf9\xb4a\x15p\xd5\xe3\xbf\x06\\;\xab\xb5[\xcc?\xffdi\x84\x04\xf6\xb9?\x0b\xa1m\xf1\xe5\xd2\xe7?\xc7\tsW\xa0~\xf1?\xe6)o\xeb=d\xf8\xbf\xff&\xcf\xb4\x9f\x85\xf9\xbf1\xf0\xca\xc2\xc7\xe6\xda\xbf\x84\x08h{YN\xb8?v\x9ac\xe8\x16h\xe9\xbf\xa1"a\x83\x83K\xd7\xbf\x0eV\xf7i\x80\x95\xf1?\xf3.\x85\xf9\x02\xe0\xf5?\xdf#!\xce\xe4\x0f\xf6?\xe7vCv\xdaf\xee\xbfR\xab\xfa]\xafk\xeb\xbfWP\xa3kT0\xbf?\xf91S\xc8\xbe\xf1\xf1\xbf\xd6\x1a\x8a\xd0yM\xc6\xbf\x083\xe4n\xeek\xd5\xbf\x11v[t\n\xac\xd1\xbf\xcb\xfe\x05\xdab<\xde?\xf4\x88k\x9c\xd1F\xd7?\x088\xae\xa5\xe5>\xe9?\x90\xb9\xdf\xe7\xfc\xa2\xf8\xbf\x02y\x03\x8d\x03\xfb\xed\xbf\xc0b\xb8\x9e\xd2)\xf1?\x98\xe2\x9d\xc2x\x88\xd0\xbf\x97m\xdb\xb1\x02S\xd4?=C\x7f\xa9\xca\xf6\xeb\xbf\x9b\xdf\xdf\xd7\xdaq\xaf\xbfbDA\xed_\xde\xe4?\xaa\xea\x15\x8bU3\xd9\xbf\x8c\xe5\x96\x87\xab;\xf6\xbf\xb7\xf5\xa1\xe0\x81\xac\xe2\xbfhq\xdc}\xac\x8d\xde\xbfI\xb04`C\xc4\xd4?\xd5(jR\xbb\x7f\xdb?\xa8Cd\x8a\x88\x95\xf4??\x7f\xac,\xc3\x9e\xe9\xbf;\xa4\x10\xb4\xa5\x96\xdf\xbf\xaa\x81\x1f \xb4+\xdd?\xa16e\xe9\xf3!\xf9?Dw\n\xc5.7\xfe\xbf\xb9\x1e\xf6\xf4W)\xc5\xbf\xadV\'x\x92\xda\xfe\xbf4\xb8\x11\xa5\xf1\xcd\xe8?R\xb7C9\x11\t\xc9\xbf\xbe\xca\xe7)V\xfb\xee\xbfF\xba\xed^\x14\xc4\xdb\xbf=\x85g\xe3\x9d\xc2\xd5\xbf\x90\x80\x1dz\x9e\t\xf5\xbfQ\xd4?\xac;=\xe9\xbf\xe1\xf8S\xdc=\xc6\xfd\xbfF\xcc\xc6)Q[\xf9\xbf\xe9\xe4[%j?\xe5\xbf\xa5N\x9c\xd4\xbf3\xd1\xa9\xa8\x86\xa3\xf0?}\x0c\xbb\xef\x9b\xe0\xd7?\xfcu\x81\xbd\xd5\xf9\xdd?x\xbej\x0c\xba\x88\xf6?\xa1\x93\x07\x9d\xc5\xbd\xd5?D\xf9}\xf5\t\x10\xf7?ht\xc0\xb42\xe0\xec?\xad\x0c\xb3\x0f\xc0U\xf1\xbf\x0c\xc4\x83N\x07o\xf4?R\xdf5\x02B&\xd2\xbfQ\x95+f\x84\x14\xde?-md,Bb\xe4\xbf\xb5\xe2\xecS9\xdf\xd0\xbf\xb3S\xea{:\xd2\xaa\xbf\x8a\xd5\xc8\x87Ln\xa2?\xf9l4\xeaF\xc1\xd8\xbf.\xca\xb9]I\x8d\xdc?\xc9\xccn\xea\xe3\x7f\xa7?/\xb2\xfdh\xf0<\xcd?\xdfQB\xb3Yd\xe1\xbfs]\xffs\xbd\x0b\xb1?G\xbb\xb0\xac\x83\xd3\xd0?\xc67\x7f\xdd~u\xfa\xbf\xa1c\x9c\xfb\x867\x00\xc0\xcd\\\x14<<\xd7\xed\xbf\x10\xc0\xddg\xcd\x84\xd3?\xa4{\xba5\x93>\xf2?\x86:\xe8Q\xab\xbc\xac?\xe1\xbblI\x016\xed\xbfn\xc8\x1ay)\xe2\xf1?\x9c\x12o\xdc\xaa\x88\xa7\xbf\xf8\xcc\xb6[~\xc0\xed?C\x0f\x1c\x90l\x1fd?\xb5My\x1d\xb4\x19\xf2?\xd9\x9e\x1af\xbe\xb4\xe1?/\xe3\xa2\xc3^\x17\x02\xc0\x03R\x134\xf1\xc7\xe6\xbf9\xf6\xdf\x9fjQ\xee\xbf,\xd7\xda\xfb7\xa7\xd1?W\x96\xeeH\'\xf9\xb1\xbfy\x06\x1dlN\x1f\xfd\xbf\xc4&\xd3:-\xe3\xd7?\xc4Wf\xb7\x1a\xd2\xf1?\x1c\xc6!V\x9dd\xe1?d\xf4\x8d\x00G\xc1\xcb\xbf=\xd4\x8b\xbf\x87E\xfc?\xc5\x08\x8d\xc6\xb8\x88\xd5?\x07\x8c\x88\xf26\x1e\xd4\xbfK7\xb6\x8d_\xdc\xf1?\x80\xb2\xed\x83\xcc\x01\xec\xbfl\x1b^F\xf9\x07\xb8?\x10\xd0h\x8b\xb5\xfb\xe6\xbfU"@\x7f9\x80\xe5?\x9dUh\xd8\xe8h\xc9?\x1b\\)W\xe5\xa5\xf2\xbfsN\xd8*\x03$\xf0?\x1d\xb0\x18#\x10\xfb\xc1\xbf 6\x0e{1\xa3\xff?W\xe2|DK\xf4\xc5\xbf/\xec\n\x953\xbb\xc7?\x86\xbd\x8d\xb1\x95\xcf\xd7\xbf\xc2\xf5$S\x08\xf0\xe8?\xd3\xa6\xcc\xde\xeef\xc1\xbf9[\xa8\x91\xeb\xa6\xee\xbf\xc2tC\x95\xa2W\x00\xc0\xf8\x05X\xa5\xfb7\xe4\xbf\xf6X\xd3@\x0c\xc7\xc1?*\x1b#j\x93\xb8\xdb?\xb5\xa1\xb2\xfbg\xa4\xe4?\xd1\xd6\x05\xe1\xa2\t\xeb?\xb8x\xf1Y\x0c\xe7\xc8\xbf\x8cvT\x97:x\xd7\xbf\x8f\xd2sB\x83\x8c\xff?\x8e\x87\x84u\x80\x1c\xec\xbf).\xa1rM\xc7\xc7\xbf\t\xcax\xd0h(\xf9\xbf\xc7\xae\x8eG\x16\x0e\xec\xbfB\x13\x1b\x9b\x18S\xd3\xbf\x85\xc2\xc3\x1bF\xda\xec\xbf\'\x1c?\x86\x8b\x92\xcb\xbfB\x04\xb5\xbe\x15\xb9\xe9?\xc3G\xe7\xba\xe5\x11\xe4\xbf\x0b\xdb\x9c\xd6\x05\x8e\xd1\xbf)\xcc\xe9\xab\xd5?\xc9?5\x85D\x8f\xae\x12\xe7?8b\xc9\x1b$\xdd\xe7\xbf2\xa2\x11^\x84\xe5\xd8\xbf\xa0^n+\xa8\r\xc0?S\x12\xe4\xd7\xd6X\xd2?\xdeE\xa5\xbd\x8b*\xee\xbfr\xe5\xf3\xe2\x16\x11\xcc?\xea\xbd\xd5\xe3g3\xf1?\x0e\x1cj\xf8F3\xbc\xbfJp\xfc\xba\xb1|\xda\xbf\x9f\xb1\x13\x0c\xd1\x8b\xeb?\xdbXb\xc1\x87\xfc\xdf\xbf\xf6\xcf\xc5\x90Z\xb8\xf0\xbf\x81\xfc%\x92\xcd(\xd8?\xc9\xd0\xbdb\x1d\xe4\xaa?\x03\x9c7\xfaE\xb6\xe4\xbf\x92<\x84M\x01\x8e\xbb\xbf\xc0\xb4\xcf\x9a\xbeH\xe5\xbf\xa4\x05\xb1\x01X\xfc\xd9\xbf\xae\xd2\xe5A\xae\xdd\xed?\xf4\x01tH\x11R\xf1?\x1a\xfe\x94=)%\xed\xbf\x95\x81\n\x83\xcb\xe1\x01@\xb2\xc2s\xd4E\x04\xf5?Zh\xe6\xdd\xb3@\xf6\xbf\x8b\xc5R}\x12\'\xf0\xbf\x86(\x02m\x91\xfd\xf5\xbfh\x1b\xf3P\x04\x8c\xfb\xbf[\x9dm\xeaT\xca\xc5?1\x00A-|\xc1\xcb?\xfaA_n\xd2D\xee?\xee7 s=r\xc4\xbf\xdfqk\xeaI1\xe2\xbf\xf3i\x93\xc6)S\xe2\xbf\xb8E\xf9\xe6Y\xf6\xe4?[f\xe3.\x1fp\xc4?+z\x9d#+\xef\xaf\xbf\xf6\r?\xc5-h\xa5?\xec\xc3i:\x02i\xea\xbf\xf0\xdc\xe3\xe4N\xdd\xe0?~I]se\xe8\xda?\x8cgV"\xf7r\xc5?T]\xd3\xb1s\xb3\xe0\xbf\xa5\xab\xda\xa0\xcd \xeb?\x9f\xd9\xac\xbb\xcfQ\xe7\xbfkM\xbe\x8bA\x06\xe7\xbf\x04\xab\x9c\x8c\x13\xb5\xec?\xee\xde\xa2M\xb0\xaa\xe0\xbfwj\x8d\xea>\x01\xd5\xbf\xfd\xe4\xe8e\x13\xcd\x97\xbf~\xafQ\\\xebi\xcb\xbf[ZD7\xcd$\xe2\xbf\x02\xfbk>/XW?/\xf3B,q\x94\xf8\xbfR\xaaC|qT\xd8\xbf3eR\x16u?\xd1\xbf^S\xd2\x94c\xa6\xd5\xbf\x89\xaa\xf4\xaf0;\xe6?(1\x8e\xeb\xc73\xec\xbf\x0f\x90\xa3f\x91\xd1\xdd?&\x1e\'\xab\x93\xe7\xf1\xbf\'$\x86j\x9eD\xfa?\x04<\x10\x8b\x1b<\xe2?\xed\x03C\xe3\xd0\x11\xf5?\\\xa0v\x85i\xba\xd8?\x0eD9\xf5\x98\x1f\xd4?E\x135l\x87\xc8\xc3?\xba\xaf\xe0\x18\xcc7\xc7?J\xdb\xa4\xac0\x1e\xe4\xbf\x83\x8a\xbd\x11g\xc7\xfb?\x13aOK x\xe9?\xc3\'\xfb\x0f\xa1\xec\xe6\xbf\x90\x8b}\xb9\x86\x9d\xb5\xbfW%\xf6\xaa\xf6\x9d\xd2\xbf\xa5S\xf8\xa3u\xdf\xdb\xbf\xb1\x83\xbb\xe9\xd49\xf8\xbf3\x17\xd5\x16\xb5B\xe1\xbfo\x9f2M\x1d\x0c\xeb\xbf\x1d\xa6\xea\xfc\xecy\xe6?/\x9f\x88\x9f\x107\xd1?\x9f\x9bp\xc0\xf8\xb7\xe5\xbf5B\xff\xe0\x0cd\x03\xc0\xfc\xf9a\xf4Ut\xd2\xbf\xe3v\xfalH\x18\xf1\xbf\xbf;3~\xf7\xb4\xb2\xbfsJ\xc5\x1fV\xda\xcb?\x8a\x9ew\xf3\xff7\x06@\xbd\xed\xa9\xce\xf3\x9c\xd6\xbf\xca:\x90B&\xbf\xfb\xbf\x88\x08AAL_\xf1\xbfJ\xf8\x14^di\xf7\xbf\xfdYz\x1e\xa6\xfd\xfb?A^\x81\xe9\x1b9\xce\xbf\x86\xcb\x0fE2L~?\x85\x84IO0&\xfa?\xf8\xdd\xb7\x9c{\x7f\xd7?\xc2\xb2D\x86\xa1\xaf\xe1?uB\x0fDA\x7f\xe7\xbf\xb1%\x18)\x91\x06\xd2?e\xf9\xbd8\xcd7\xe5?\xe6\x0c\x94\xbf\x04\xad\xf9?0\xc1\xa8\x07L\xd7\xf1\xbf\x1b\x81a\xa3\x7f*\xe6?\x8d\x90\xc2\x10\x00\xf6\xe0\xbfP\x92Q\xb4\xd9\x16\xba?\x95\xc6P\xe7\x12b\xbb?\x11O\xfbw\x86\xa7\xfb?\xfe\xd1\x1d\x9e4\xf7\xf0?f\xdc\x90_\x87t\xe6?\xfa|\xe4\x83)\xde\x98\xbfc\xce\xa4\x96\xba\x04\xf4?\xa4\xb5\x896\x97\xd3\xfa\xbfc\xe7\xe4e\xe5\xc5\x86\xbf\xee\x07(\x13\x191\xe0\xbf\xa3;@~:.\xe7?luY2b\x01\xe4?c\xc78\x9cnn\xf1\xbf\xdb\x98oA\\f\x03\xc0v\xafB\xc8\xfd\xa2\xe2\xbf\xfb\x05\xcb\xf5\x95\xeb\xe6?2V`r\xa4<\xce?t\xa6Y_yu\xe5?\xb7@\xc3u2\xab\xdf?\xb1/\x01\x16\xc5\xe6\xe5?RL\xdb\xe4\xa6\xe8\xee\xbf\x95\xaa\x86$\x16D\xd7?\xf9\xbd\xf1K\xed\x85\xac?\xa2\xdb\xcd\xc5a\xdf\xf2?\xfe\x0b\xbe\x89\xfb\xe6\xf0?p\x94\x8c\xcf@:\xf2?7R\xc84Y\xa1\xeb?,\xff\'\xb1v\xdc\xdf?\xf3\xa8\xc1\\\xcc\xdd\xe1?\xb6I\xf2V\x03\xb8\x00\xc06\x9f\xb2J\x16\xa9\xdc\xbf\xa1\xe8W$f9\xae\xbf)\x9e\x86\x8a\xbf\xd5\xeb?\xe0\x85\xef\xfd\x93T\xfc?W1\xfd\xee\xb2x\xe9?\xf0"E\xe4\xa5\xb8\x03@0\x05\xd2[\xfe\x96\xcf\xbf5\x08-\x08v\xc7\xa9?\x1e\x7fg\xed\x9d\xcd\xb8\xbf+ke\xb6\x0e\xf4\xf9\xbf\xe8\x1bs\x8d{\xca\xcc?\xe8G\x81\xfa{\xed\xd2?\x0b\xcd3\xdf\x8e\xf7\xee?\x19\x06\xe1PR\'\xd7?\x0c-\xdc\xcd(~\xf9?\xc0\x99\x07\xe1-\xca\xc5?b\xf7\x80E|N\xd4?\xdd\xc3t?<\x98\xb2?\xc1m\xb9\x0e\xce\xf4\xf6?^\x11B\xef\x10\xdd\xba\xbfL\x9f\xf9\x17#\x03\xd5\xbf\x82\xdbxnF\xf1\xdb\xbf\x02~e\xf6Q\x0c\xf1?\x7f\xca=ht\\\xf4?k$bFl\xae\xf2?d\x874\x14_\x1c\xea?9\xa4\xa7\x19`n\xd0?\xc7\x97V{^\x03\xef?\xdf\xd0\xc7\xc2\\N\xee?\x91\xe7\xd8\x1dh|\xed?`"\x86\xde\xb4\x97\xfc?:\xdd\x94hD%\x06@-\xcf\xdc\xa2<\x84\x00@\x1f89\x9c4\xa4\x05@t\xba\\&\xbf\xec\x02@{\xad\x99xq\xc9\xf0?J\xcb\xc6AF\xb3\xfa?\xa2\xcaL\xf9=\x88\xd0?\x1dK\xec-\xae\x81\xe0?\xca\xfe\xdf\x12\x8cH\xda\xbf\xb4\x1c\x90\xfeu\xfe\xe0?v\x8br\xd2\xda\xc7\xe4?~(\xd4\xe7|T\x94?P\x17XeB\xd0\x94?\xe9\xea\x90*\x01\x90\xe0\xbfn\x03g%\xffZ\xe7\xbf\x86\x01z1\xd3\xe8\xb1?Z\xc7\x15\xd1i$\xe5?y\xaf\xb5\'\x1dE\xec\xbf\xd1\xa8\xe5\x8dS`\xf4?,\xd6\xfb\x9d\xea-\xe6\xbfX\x1f\n&G\xd5\xf8?_\x9d\xc9\x1a\x9d\x83\xfd?\x0bz\x07a\xcc\xc0\xeb?\xd4i\xf5\x0cF\x10\xfd?\x131=\xdc\x0e\xcc\xdf?N\xf0=\x1a\x04\x11\xd5?\xe9\x97t\x03\xa6\x0e\xf6?\x92\xde\xf5,\xd6\xfe\x04@eW\xba\x90C\x86\xf5?\x16\x87\xd9\x87_\xfe\x03@\x99R\xe9\xfc\xc9\xad\x03@\x9f\xc0!\n\xcdt\x03@\xfd\x92\x0b\n6\xec\xf5?\xe5z"\xff\xe5\x7f\xef?M\xc3\xd3\xe6\xfb\xd6\xe9?\xcc\x96.\xcd\xbe$\xdb?\xe3z\x8dh\x04\xd1\xca\xbf\xbf\xed\x02P\t\x8b\xec\xbf\xc6\x84\xf6\xef6\x01\xd8?\x1a-\xeaG6\x18\xed\xbf(\xa5!l\x93s\xdb\xbf\x9b\x13G\x12\xe3\xdb\xf4\xbf\xcd\x03r\x0b\x03j\xf3\xbf\xe6\xb3\xdc\xc5\xc0>\xe3\xbf+\xabw\xc2z\xe3\xce\xbf\xef<\xf2j\x07>\xed\xbfB\x9b\x8a\x16\x8bX\xad?\x18z\x96\x96#P\xf2?v\xab\xba\xd94\\\xb9?\x97\x16GT\xd6X\xfd?\x95\xf9\xd6A\xeb\x9e\xff?\x15B\xb8\x02\xf9[\x05@C\x18m\x8b\x15!\xed?k&\x84MHP\x04@\xb5\t\xb3\x8cdE\xf4?\x8f4\xdb\x8c\xaf\xb1\xf1?\xd8\x82\xa9\xe73\x1f\xe6?\xb9\xc1tl\x02\x13\x9e\xbfU*F\xd2d3\xe1?\xdf\x1bYr\x86t\xdb?\xfd5$S\xf8\xfb\xf8?\xf1\x94\xc5A\x95\x98\xf9?\xfc\xbd\xc6\x07\x82\x94\xe1?)\xbd\x17\xd1;:\xda?\xca\x07R \xd7\x1a\xcb?\xe7\xdf\xde\xc7~\x94\xf1\xbfu\xc5\xbd\xb6\xd7A\xc6\xbf\x9d\xde\xde\xa1S\x1c\xee\xbf\x84\x9b\xa6\x895\xc6\xec\xbf\xecp\\\xcb\xa3\x16\xf2?VE\x0bY\xd9\xf4\xc9?\xd8f\x95\xf3^\x06\xd9\xbfj\x94\xfb\\\xee\x1f\xe8?^n&R\xb1`\xf2?\xcc\x03\xd7\xcd1E\xe0?\x07\x0b\x85\xa8 q\xd5?\rf\xad9\xd3\x9d\xf0?\xd9/\xd4\xf6?\xa9\xe8?>4\xb9\xfa\xf1,\xf1?\xc4"]\xfeT\xcc\xda?\x1a2\xdd\xe64D\xf8?qr\x86V\x8b\xb1\xf0?H\xaaVE\x1a%\xd3?&Z\xa5\xd7_&\xe0?a\x91\xb4As\xfe\xe9?\x91\xa9\xab\xf0\x9d\xf4\xf1?|\xbf\xfd\xc4R\x82\xba\xbf\t\xfc\xcb&\xaf"\xc7\xbf\xda\xaa\x17>\x84:\xf4?\x8crg\xf3 \x17\xd9?\xef\xce\x08\xa8\xdf\xf2\xf5?\xac\xde\xfd\x93hr\xfe?V\\\xea\x848\xbc\xee??\xd7\x954\xa3^\xd1\xbf\xb0\xc7\xf8\x06s\\\xd2?\xadf\xf0\x81\x81\xb2\xf0?M\xbd9\xaf|\xa9\xc1?W\xb4\x89\xe0ZK\xc5?UL\xcb\x06\xc1\xed\xea?Z\xc6\xd9\x80\xb88\xdc\xbf\r\xa1\xbd4\xe9m\xda\xbf\xab\xe2lL\xa8{\xdc\xbf\xa0v\xa3\xe6Tu\xce\xbf\xd03f\x1d\xb3\xb3\xea?\x93\xc2\xcd\xae<\x8f\xea?\x08N\x97\xa1\xb8)\xc0\xbf\x99\x9a\x9f\x97\xab\xba\xd3?&Nl#\x82\x1e\xd5?\x1c\x02\xf9XL|\xa4?S\x99b q{\xf0?\xbeK\xec\xa4\xf0q\xdb?\x0fe\xed\xc4\xc3\x17\xe7?\xfa\x97\xb8(\xcc\x81\xf0?\xe1\xf3\xb7\xf6H\xa7\xf2\xbf\x84\x18T\xa3\x86\x08\xd1\xbf\xaf4\xa6DQ\xe2\xde?\xb5\xec\x9f\xbc\xfb4\xe0?\xe2\xa2\xcdJ,\xa5\xee?b\xd2\xda\x03\x9d\x1c\xe2\xbf\xa6\x8c\x1c9\x8cC\xe2?\xe6vzZ\x1f\x83\xf1\xbf\x16\xce\xb8\x85\xf3\xde\xf0\xbf\xe7\x05tJ\xca\x04\xbc\xbf\xcc;\xdc\xec\xb2d\xaf?\x1b\x88Rc|2\xf3?\x97\xb2w\xdfl\x10\xdb?e\\\xfeN\xe0M\xde\xbf\t\xe7\x98\xf2\xd6\xe1\xde?\\\xef\xb2M\xc2/\xc8\xbf\x90\x16M\xb8\xbb\xc2\xca?@\x11l\x8a\x1f\xff\xc6\xbf$\x03\xad\x1dF\x96\xdc\xbf\x8d\x14\xc0\x89\x99b\xf2?)\xda\x9d\xb3\t\xdb\xd9?\xcd#\x1e\xd2k\xc4\xd2\xbf\x0e?h\xab\xd5\xd6\xe2\xbfj\x95"\x98\x01D\xca?\x83\x91X\xf8\x8a"\xcb\xbf\'\x95\xff\x8da5\xe5\xbf\x9f\x8a\xb0=\xce\x87\xf7\xbf\xf6Y\xa3\xe9\x9fe\xe8\xbf\xa0}\xad*\x8f{\xb8\xbf<\xec\x19\x92\xc2\xb5\xee?i\'\xb9p\xdd\xbc\xdd? T\xfdv\xd4\xff\xdd?q\x14C\xbe-\x88\xf2?\xf0T\xcc\x8c`\x95\xf5?%L\xf9xY\xfd\xd5?\xc5\x1am/\xb6R\xed\xbf\x9c>\xd2\xd1u\xf4\xd5?S&\x07\xbfK\'\xdd\xbf*w\x83\xef\x90\xd8\xcd?W\x8co_\x7f\r\xf4?\xb0v\xf8\xf9\x82h\xf1\xbf\r\x15|=\xfcL\xbb?\xe9Dd\xdd\x7f\x93\xe9?\xc0\xf7\xe80\xdf(\xe6?o\xd3\xaf\xf2\x1f\x9e\xe5?z3a\xb6\x0f\x90\xc8\xbf\x93\'\x98\xe6(\x16\xd4\xbfmD\x9dX\xf1\xf4\xd7?n\x9a\xef\xe0^\xc6\xd7\xbf\x8c\x1aE#\xdb8\xb1\xbf\xf4\'\x87\xd1\x1eM\xd9\xbfCFD\xc7\xee"\xc1?Y\x92\xe5\xc6i\x18\xf3?\xa6\xc6\x9b6\xd5\x1b\xd8\xbf\x95\xddP\xa0\xb8\xcb\xf5?-/d0N\x92\xda\xbf)SZFh\x90\xd2\xbf\x9ex\xb7\x85)\xf3\xf1?\x98\xd0\x12\xab\xb0S\xd4?\xf2lt\x15\xc7sl\xbfleX\xf3\xcb\xae\xb3\xbf\x1aO\xee\xe4\x1a4\xd7?H\xad\xd2y\xe9\x85\xea?i\xbb9\x8cq,\xf5\xbf\xba\xbc\x83[\xca\'\xf1\xbf\xc58\xaf7c\xa2\xc6\xbfr\xa58\xe0\xcb%\xf1\xbf\xbb\xe8\x07\xf83t\xdc?\xc6m\xc3#!Z\xe6\xbf\xd8\x11\n\x97:]\xd5\xbf\xb2\xc5u\x86\xeb\x8a\x02@a\xcf\x81T\xfe\xe7\xe9?1\xddZ\xda\xf5\\\xed?ff\x19\xfa\x81i\xe1\xbf\x0b\x163\xdaK\x8d\xe3\xbfr\x9f\x12\x81\x01\x84\xd8?\xe53\xa0\x97Uw\xd6\xbfn\xe7YAFO\xbe?\x13\x8cj\xc0|\xc6\xdc?y\xd4\xbc~\xed\x10\xee?8\x87Mj\xb0\xda\xe8\xbf9\xad\xe2\xb4L\x8b\xf3\xbf\x05{\xd8\x97\x16l\xbc?\xe5\xea\xba\x8ah\x89\xe3\xbf4n\xc2\x06\x94\xa0\xf4?\x0f\xa0/\xd5\xe0\xa9\xe3?\xa4\x85Os/R\xc7\xbf\x8f\x06r\xfa\xdc\xd1\xd5\xbf\x93O\x04?%.\xe6?\xa3\x91\xb9\\h\x83\xe6\xbf\x04\xe0\xf1\xd0\x98\x1b\xd8?\x89d\xe8?\xf8\xb6\x1b\xda\xba\x7f\xb5\xbf@\x82m\xbf\xe4\xc7\xea?k\xf5\xc2\x1b\x99\xcb\xd9?\r\xb3\x83\xf3\xe4T\xdf?(/.}\xad\x7f\xdc\xbf\x8a\xff-\xfc\x06\n\xf5\xbf\xea\xa7\x1f\nke\xf0\xbf\x15\x1bp\x91\xc7\x84\xc1\xbf\xa2^\x0f\x9b\xc4\x84\xf1?\xbcu\xc3T\x83~\xf5?\xc8\xed\xc3\xa2K\x81\t@\x00S\x99~O%\x15@N9_U\xb9v\x0e@\xd4iC\xf8b\xeb\x06@ur2D\x93^\x06@\x843?\xa7\x1a\x08\x07@\x16\x1a\xbcl,\xfe\xfe?\xcc\x11}\xef\xbfO\xef\xbfW\xd7k8F\xb6\x00@\x87\xbaU.\xfa\xa4\xa4?\xf6\xe2\x8e\x95?C\xf6\xbf\xbe\xeb\xf3<\x1a\x91\xb5\xbf0\x1e\xe69\x8b\x87\xcc\xbf>\x02]\xadq\xc0\xed\xbfa\xfc\xa0\xa9e`\xe4?\xae\xe5\xb4\xb9\xe8\xa5\xdf?\x8d\x91+\x876\x16\xa8\xbfw\xb88\x8c\xaet\xe8?\xac}Q\xec;\xb7\x00\xc0\xe9\xb4.\x98\x16\xa4\xee?\xeby \x00\xcd>\x9a?\x9f\xd3\xf1:\x10\\\xe7\xbf\x98u\x8dp~m\x90\xbf\xc7\x82\xef\xdc.\xb2\xe5?\x08fN?q\xb1\xf3?\xfe\xb8\x15\xd3\xd0\xb0\xda?\xdb\x8b\x91\x115}\xbe\xbf\xec.\x19\xe0\x98u\xeb?\x06\x07\xe7\xd3\x080\x03@\xf3w\xef\xc4\xa1W\xe6\xbf\xbe\xcb\x18\xc9\xbd\xef\xe5\xbf\x90\xfdf>\xad@\xf0?>6\xc2\xe5\x8d)\x00\xc0\x9cG\x98$\r\xa4\xfc\xbf\x99\x1c\xf6\xbc(\xd8\xf6\xbf\xb1~\r<\x84\xd5\xe0\xbf2\n\x8b\xce\x9e\x85\xea\xbf\xf0!\t\x80\xc7\x95\xfa\xbf\x83\xd3\xee\x8d{\xeb\xb3?lY\xa7\xfe&\xf3\xff\xbfp/\xb0m\x8a\x97\xe1\xbf\x88\x0cv\xe8\xdb\x19\xea?b6*\xd4\xb2\xd2\xe7\xbf\x01Si\xc7\x11\xd6\xd4?\x82\x98\xb2hU\x95\xfd?\xde\xce=\x0c!\xa2\xf0\xbf\xc5joN?\xb1\x01\xc0\xad;\xc13\xd0j\xd7?\xcf\x97\xac\xad\x93V\xd9?,\x13\xa1\xa3\'\xaf\xe7\xbf\xf3\x12\x8e\x15\x8d\xa8\xb8\xbf\xce\x96\xa9\xb8\xec\xfa\xe4\xbf\xce\xb1"x[\x1b\xdd\xbfxCm\xfel@\xf8\xbf\x98\x99\xf0\xb6x\x0e\xf5\xbfb\xed\xc7\x02\xcf\xb0\xfb\xbf/\x7f\'+\x93\x98\xed\xbf\x8b@\x1b\x7f\xc7\xa5\x03\x13\xb5?\xf5l\xd8\x96\xcax\xf0\xbf\xfe\n\xc0\xa6\xd9\x1f\xc8\xbfe\xfe\x97\x1d\x90\x12\xed?w\xca\xf6\xbaR\x12\xe0\xbf\x96\xfc;\xd0n\x9e\xc1?:J\x14\xb3\xbd\xa5\xcc\xbf\xc2\xa8\xf73\xdb+\xe7\xbf\x01 &+\xa4B\xfe\xbf\x1f\xda\x1c\xb3\xe9M\xfd\xbf\xb9\xc6]\x97\x00\xb4\xe6?\xf3\x03/\xdf\x87>\xfc\xbf\x84\x19=\xa8\xeb\x90\xf0\xbf1\x8a$]s\xba\xee?D\'\x1b\x92\xd9v\xc8?\xdbF).\x8b\x1b\x06\xc0\xf3QW2F\xbe\xd8\xbf\x98\x9be}\xf8\xc5\xfc\xbf\xa0\xae\xff\xd9\xce\xdc\xf3\xbf&"{\xbe`\xd4\xee\xbf\x0bx.\x1ft\xfe\xf1\xbfZ\x84\xe89\x8e6\x03\xc0\xa1O2\xa6;\x1b\x02\xc0\x86)\xbb\xeb{O\xea\xbf\xfe\x8c\x7f\x1bD\xe3\xea\xbf~\xb5\n\x9e\x14\xb4\xf8?2\x90E=\xae\xc9\xf2?\xc9\xe4\x93X\xfa\x12\x07@7v4\xba@@\xc9\xbf\xbb\xe8\xbe8$!\xb8\xbf\x8f\xb1\x17\xb9\xba\xdd\xea\xbf4\xb3\xa4\'\xf0\xe2\xc8\xbf\x01%(\x83\xde\x17\xe8\xbf\xb0\xf5\xd1\x89\xd0\x02\xd1\xbf\xda\x18U\x81\xd1\x87\xf0\xbf\xf7\x80|\xbe\xe8\x19\xfe\xbf\xab;\xb7\xdd\xbe>\xf8\xbf\x16\xca\xbe\x11\xe4\xfc\xb1?}\x11m\x08a\r\xc6\xbf\r\x84\x99\x1d\x18\xc1\x04\xc0\xe2\x17\xb5\xd1\t\xd1\xd7\xbf\x9bxXf\x9a\x93\xf2?a\xac\xb4\xfb\x19R\xd0?\xc1\xd0BO\x90b\xe0\xbf\xb3_I;\xa9\xec\x04\xc0].\xa9}\xb2o\xe2\xbf\xe565\xcc\xe4u\xd2\xbf\x88\xd3\x9br\xeb\x1f\xf0\xbf\xee\x01}\x89\x1c\x12\xf6\xbf\xef\xaf\x08L\xd9\xa4\xf5\xbf\xbd\xe1}\xf7\x0f\x95\xf2\xbf{\xacg\xcf\xd9b\xf9\xbf/\xbc2#\xd9\xda\xfe\xbf+\xa6\xe3\xc5\n\xde\xf1\xbf\x84\xb8qk\xc6\xbe\x0b\xc0s\xa3\xc2\xaf\xfaQ\xec\xbf\xf2\xb8\x93)\x878\xc4?p\xc5\x06\x0f\x9cY\xfc\xbf\x9e\xef\x86\xd1\xd63\xd9\xbfx\x93Q\xe1\xa0\x13\xb8?rX4\xa6Q\'\xbe\xbf\xf6\x81\xb1I&\'\xd8?\xcez\xc0\x89\xf3H\xf0\xbfW\xb2\xae\x06}\x84\x08\xc0\x86T\x05\xe9[J\xf8?:wv\xcf\x90\xb1\xf1?\x84\xcf\x03\x18,f\xe0?\xb0T\xcdsw\xb6\xdd?2\x84\xd4\xa7\xad\xd0\xbf\xbf\xe1,\xff\r\x8a\x8b\xf8\xbfa\xf28\x92#:\xfe?\x07\x11\x8d\xd6\xe90\xeb\xbf\xbf\x87\x88\xaeI\x80\xfb\xbfsw\xed\xc09\xea\xe0\xbf\xd3\xe2qP\x0fb\xb9?\xec<\xe62\xc4\xd6\x13\xc0\'\x93\xaf(\xc4R\xd8?\x10p^\xa1\xcd\x1e\x12\xc0`;7\xfe\xbb\x19\x13\xc0\xef\x05u\xa8\xf4y\x03\xc0m\x12\x9dc\x97\xc0\x07\xc0T\xc1\r\xea\xdc\x10\x03\xc0c\x88\x96\x9f\xd3q\x16\xc07W\x9b\x17\xd3\x16\x0f\xc0\xd1Y)tVv\xc1\xbf\xe1Z\xd3f\xb6g\xec\xbf\xe9\\Fj\xe5i\xfe\xbf\x02\r\xbf\xc4C\xf4\xe9\xbf\xc2\xc3q\xf0A\x0b\xf2\xbfr\x0cM\x83\xb6\xa5\xf3?Y\xf5\xe5\xa4\x80\xf9\xe0\xbf\x13|\xbb\x1b\x7f\xea\xe4\xbf\xbc\xc2S(oh\x01@\xfd\xb9\x83\x95\xe7\x8f\xeb\xbf\xb0V\x0f\xb7\xdf>\xc2?\x95\t\xa5}z\xf0\xf5\xbf%v\xdf N.\xe8\xbf\\\x0bOl\xee5\xcc\xbf\xfbXI1\xbd\x0f\xfb?(\x15\x0fY\x83\xa5\xf1?\x8e\x8f(=l\'\xb7\xbf3cKZ_n\x00\xc0\xbb \xa3\xfb\xe2\xc8\xfe\xbf\xc0~\x81\x10E\x15\xfa\xbf`\x10\x0co\x8d\x9c\x0b\xc0*\x8e^\xb7\xb5\xca\x0e\xc0\x07,\xf0\x7fo\t\t\xc0\t\x1dg\xb2\x9d\xc0\x06\xc0\xdf\xc8\xce\xfd\x11\n\x05\xc07\x13|$\xda\xe4\x02\xc0\xc2\x13\x9c\x9fl2\x10\xc0\xee\xbe\x1ap\x81\x80\x06\xc0\x02\xbf\x9f\x03&\xf4\xe3?\xb6f\xec\x9b\x02\x18\xb7?A1\xcd\xf92\xab\xe7?8Tv\xae\x12_\xf6\xbf\x19\x9cUS\xba"\xdc\xbf\xa9nGz\x1eK\xea?I^Q=\x1e\x06\xf2\xbf\x8ez\xde \x15k\xe4\xbfw|\x04\x00X&\xe9?\x0b\x0b\xbe\x04\xc3X\xef\xbfD@Y\xcb\xac=\xeb?\xcc`\x80\x1a\x81\x85\xc8?\xcfb\xa5mh(\xf3?v\xdf+Y\xe5\x10\xf5\xbf\xd9\xfbl\xee\xf31\xd3?H\x1d\xc1\xfe\xa1a\xee\xbf\x08\xe7P\xfa\xc6\x02\x85?\xcd\xd1OF\xa8\xdb\xee\xbf\xf1w[\xa7}\x08\xfb\xbf\xc5\xda\x17\xba\x9a\x01\xfb\xbfX\xf1\xd3\x0c\x83\xb0\x05\xc0\x9b\xc6\x19\xb5\xbaD\x04\xc0!\xdaK\x1f\xc3\xa2\x05\xc0\x14\xeb~\x12E\x0e\xef\xbfL\xcaQBc\x8c\x05\xc0\x91\x185\xfa\x88\x8a\x02\xc0\xbfx\xa9\xd6[\x9b\xf7?1\xa3x\x7f\xc9\xdc\x92\xbfzV\xcfN\x1e\xf9\xb4?y \x9eC\xd6\xeb\xbf,\x12\xe2\xc7\xe3N\xe2?X\n\xb4F\x82\x05\xe1?\xca\xe3\xa4\x8c\xc4\xd0\xc4?\xa1\xf2dX\x12F\xd7\xf4\xbf\xd2\xbf\x94\xd8\xd5\x86\xf3\xbfQ\xfb\xb6\xda\xae3\x00\xc0\'\x19f\x00\xd4\xf0\x00\xc0\xbb\x17\x84h\x0e\xc3\x04\xc0\xe21@\x0c\xf5*\x05\xc0\x8d\xd0e\x06n\xc7\xf1\xbfe\xc8\x80\xc1\xe2\xfa\t\xc0\x8f\xfa\xf0\xd4\xa6\xce\x01\xc0G7M<\x1b\xd4\xf2?\x1f\xc9jHD\x0f\xaf?(aZ\x1d\xee^\xa1?\x10\x12\xdc\xbb\x83\x03\xf5\xbf8\xfdg\xe9\xc2\xff\xba?\x1f\xef\x8d\xe7\x1c2\n\xc05\xeaK\x1d\xd5A\xd0?\xf0\xe6\xcd\xd0\xc7f\xc5?\x0f\xd4\xd4\xa7\xb6\x87\xb1\xbf\x9f\xd1\xa9\xb5\xbe\xf5\xfa\xbf9\x1a\xa9\x18\x9f\x13\xf5?\xeb\x12\xc5T\xd0o\xf0\xbf\xcf\x14\xe5md\x8b\xfb\xbf\xfd\xd2\xec\x84\xf3\xa8\x01@\rEi\xd57\xc9\xeb\xbf3\x8fU\xfe\xb9B\xe1\xbf\x8e\x8a\xea\xd8\x08\x8f\xea\xbf\xad\x9e&~\xcao\xe4?w\xd2\\[\x92\x01\x00\xc0w\xad\xd4\xf8\xcc~\x11\xc0\x9c#\x01>\xa3\t\xfc\xbfJ\xc5\x90\xec\xa3\r\xf7\xbfec\x8d\xf9\xf2V\n\xc0T!\x05Q5N\xff\xbf:G\x1e\xf2\x17B\x01\xc0]7\xf3y\xbb\xcd\xd9\xbfj\xf5}\xc9\xd7\x86\xe8\xbf\xb5\xbc\xd7{\xeb1\xeb?w\xb0\xfa\xa7iQ\xf9?\x85f\xb7$\xf3\xd8\x05\xc0:\xa04qp\x1a\xe0?i|\xbf\x02\x80?\xe3\xbf\xe1n\xc6\xbdy<\xb4\xbf\x060\x8e&\x06"\xe3?\xf3\\\xccK\xedN\x81?r"\x19\x80U$\xf5?Y\xf3\xbf\xa0\xc3\xb4\xd2?\xc5\xd5^\xb2\x03\xbd\xf5?\x9dp\xb6\x0eX3\x01@\xb5\x0c\x8e\x84d\x0f\xe6\xbf\x9b\x9b\x1f\xb5\x94\xea\xe2?+\x806#\x1b\x9f\xe5\xbf\xa11JZ`X\xe1\xbfsUB\xc5Z\\\xca?DK\x16\xb6ny\xfc?\xba\x99\xdd\xa3X\x9c\xfb?`]\xb7Y\\K\xfa\xbf\x16\xc8G\xf0W\x11\t\xc0e\xe0V\xd0\x0f\xf6\x07\xc0E\xdd"\xbc\\\x07\xeb\xbfx\x0bS\xab\xf1\x1f\xe6\xbf\x0e\nq\x04\x83+\xe0\xbfO\xd0\xf9\xdfc\xd0\xdd\xbf\xf8a\xc0\x06m\xe9\xf0?\x0c\xfe/C1g\xbf?\xfc\x0f\xcf\xd3\xd1\xcd\xe2\xbf\xa3smS\xa2\'\x02@\xd2\xf8\x08_\x16R\x9a?\xe8\xdan\xca\x1aY\xe2?\x91\xbe\xa4\x83{\x80\x01\xc0l\xa1\xdc="y\xe3\xbf\x1cj)\xba\x99z\xf4\xbf\xeefP\xfa\x88\xce\xf6\xbf_\x86\x14\x1d\xa2=\xfb?\xf8\xd2\xcf\xc0\xeaa\xde\xbf\x8f\xc7\x97\xa7UX\xcc?\xdc\xe0K\x1ek+\xf8\xbf\x83\xb0#\r\xdf&\xd3?\x03\xed`w\x83\xaf\xeb?&e\x1cA{\xdb\xd5\xbfu\xfa\xf8\xb1\xc5"\xf2\xbf\x93\xab\x8e\x07\xd2\xd1\xc9?;\x07,\xd5)\x88\xf2?\xc9tZ|\x05\xad\xd3\xbf\xc2\x928u\x16I\x0c\xc0q\xfc|\x1c\x7f\x06\x02\xc0\x83u=\xf7\x12%\xb1\xbf\x84z\\\x9a\xf2\xd1\xec?\xc0\xb2&H>\xf4\xcf?\x85P\x8a\x82\xe1\x1f\xd6?\xeaj\x8d\xaa`\xbd\xed\xbf.p\xad\xb4\xccE\xd3?\x05@\xbc3\xbf{\xfc?B|s%\xb4\xac\xfd?\xf7\xfa\xb0\xa1\xb3K\r@\x0e\xd15Ri\x8b\xf8\xbf\x94\x0ca\'j\xb6\xe8\xbftk\x82\x1d+:\xd3\xbf\xc3k\xed\x92\xc2O\xea\xbf\xc8/\x06\xd2s\x01\xc2\xbf"\xee\xf0\xb7V\x8b\xe1\xbf\xdbH\x95vpH\xc7\xbf,\xb8\x9b(?\x1b\xf4?\n\xfe\x8e\xe7\xd4\xf7\xef?\x83*\xd9\xa6\xaf\xb0\xd8\xbf\xb0.)+\x81 \xe7?\xd6\x7f\x86r"\x11\xde?\xbe\xe4c\x88\xfc\xf2\xc4?\xea\xa1;g\x9d\xa5\xb3\xbf\xf6\x1d\x1d\xf8\xa9\x1c\xfa\xbfLG}\'H+\xe6\xbfe\xbc\x15\x8e!+\xf8?50"4_]\xf8\xbf\xee&!\xdbZ\x92\xe0\xbf\xd7X\xa6\x9e\xc3\x13\xf3?\xc2~(_\xdb\xd6\x00\xc0\x0c\xd4\xcf\x98^\xc9\n\xc0V\x17\xa2\'\x07\xae\xf8?z\x87\xbc\xee\xff\xbc\xe1?\x19a\x1c\xa7\xc7@\xe0\xbf\xce\x00\xd4U\xc2\xcc\xdf\xbf\x0f26\x04\xaf\xe4\x0b@\x14\xffpO\xd4\x98\x00@\x8d\xb7q\x95\x15\xc5\x01@\xda\x19\xbbx~j\xe6?8)\x15lR\xfa\x00\xc0C\x9a.\x04\x0e;\xc3\xbf\xbb}\x12\xb9\x91x\xfc?\xbd\xa2$\x0bw\xf6\xf4?\x14o\x00\x18\xe9\xec\xf4\xbffM)U\xab\x7f\xde?}\xc6\x81\xe0\x84\xd8\xe8?\x08T&\xab\xa0\xa6\xd5\xbf)\xf3Vx\xf5\x9a\x0c@[\xb1\x06KC\xb3\xe3?\xd4\x9c\x143nX\xe9\xbf\x92Oq\xd5\x92\xd5\xc1?A\x82mK\x17\x8c\xd4?\x887\xb0\xe5i\xf0\xe1?\x80-\x7f\xfbu2\xe8?L\x91\x80\xbc\xe0\xb8\xc1?\x1e\xee/\x1d\x027\x03\xc0\x83\x07\xd6\x0b=,\xef?\xc7\xb9\xc1\x96\\\xe4\xf1?\x8f\x96N\xae\x16\xb8\xea?\xd9[\x8di\xac%\xcf?\x99!\xcb\x05\xea,\x06@Q\x96\xbd\xfa\x9a\x7f\xe5\xbf\xa9\xefD\xae\x15D\xd3\xbf\xe1J\xb19t\x08\xd5\xbfH\xba\xe9\x1d\x16\\\x00@\xb7\\\x81\x11\xf0\xc7\xf7?\x10\x9aI;\xef\xbb\xf9\xbf\xa1\x1c\t\xed>M\xd6\xbf\xed?\x86j\xcd\xef\xf4\xbf\xde\xeeh\x9a\xf8\xff\xd7?zUM\x8d\xc9W\xfb?h\x17\xaee\x90\x8e\xcb\xbfN6\xbe\xb7\xa3\x1e\xf4?\xe8d\xf5\'\xbd{\xb5\xbfeLZ3\xae\xcc?\x8bX\xbf\x96[\xd6\x01@3\xb7\xd4\xf2\x92\x07\xdb?\x0b\x81^\x1eJ\x82\xf7?\xf1\xf9\xbd\x88\xeaM\xeb\xbf\xdal\xf3\x85 {\x03@Z\xb8\xec\x0cO\x81\xf5?\x89\x1a\x0b\x80m\x98\xf3?|\xd8\xd6\xcb\x9c7\xfc?\xdc\x14\xab\xc3\xb5\xf0\x98?\x04e\xe2\xa2\xcc\xe1\x02@\xe8l+\xe4\xf9\x81\xf4?\xc0\xcb\x93\xc0+\xf6\xec?nP\xc4\x1c\xe1\xc1\xc7\xbf\x85\xcex\xfd\xc0\x9b\xea\xbf\xe0)\x99\x17\x9e\xc9\xf7?\x84\x86\xf4q\xc2\xda\xd3?\xa0;\xc9\x96d]\xfe?!\x06.j\xb2\x91\xfe?\xf7\xb8\xe4\xd3\x0b6\xdc\xbf\xf9\x9b\xad.&\x84\xfc?\x1d8e%\xa7E\xe6?\x95\x0b\x06\xf8LG\x98?\xb8\xb8d`\x0b \xe2?\xc1Y\x0f\xe7\x04\x1f\xf9\xbf\xd7p%!\xecI\xa5\xbf\x01\x1b\xf3\x17>\t\xf8?\xfc\xbdR\n7&\xf4?\xcc@(?\xcb[\xdb?\xda\x9a\xedD\xbb\xae\xfa\xbfP\xa6O(\n"\x0e@\xd9l\xb8\xd8\xe1\xb5\xe1?{f\x9f\xa52\xe3\x15@\x9a\xce\xc2\xf0eJ\x0b@\xba\xaf\x84%\x1eA\xf4?5`W\x83\xfa[\xe2\xbf\xd0\xb9\xad\xc5js\x0c@)*\x9fd\xb0\x81\xfe?#\x8e\xa2\xfc&\xc7\x01@\\}\xca\xf7\xa1\xe8\xab\xbfal{x\xd8\xe5\xfd?\x1e\x1f\xbf\xe1h\xf9\xf9?\xfe\t|\x92\xe56\xc9\xbf%\\\x9e\x98\xfe\x07\xf7\xbfxu:\x88\x9a\x97\xf2?\x07|\x18\xf4\xf9|\x00@\x0e\xeb\x00\x05j\xcf\xf6?o\xb2\x88-\x84\xad\xf6\xbf\xfa\x1c\xf5\xed\xe2Z\xe5\xbf\xb2\x80\x1ba\xdau\xd3?\xf6i;\xd0\xe6\xae\xe2\xbf\x13Fh\xe3\xbf\x1da\xbf\tv\\<\xfc\xa9\xc6\xbf\x9fe\xc9\x17O\xf9\x03@\xd7%k\x12\xf0_\x10@\xd8\xd5\x8cs\xbf\xc2\xf8?G\x197=\xe7\x85\x05@\x1e\x0c\x16U\x87\x9a\x0c@\x11u\xe6\x94~\xfb\x04@\xd4n \x95 \xb7\xe3?M}*\xbe,+\x0e@\xad\xe0\xea\x1c\xf8\xb9\xdf?\';\x1f\xb2ll\xf7?QG\xec<\x80P\xd5\xbf\x8c1#\xb9\xfd}\xd1\xbf3\xc2e\x055\xb9\xf8?w\x9a\x1f\xafv2\xd7?n/#WB$\xd6\xbfg\x1cE`\xe4}\xf6?W\xe2\xf6\xd9\xc6\xa2\x92\xbf?\xf6*\x925\x99\xe7?\x12\xac\x8d\xd4|\xf9\xfa?X\xad\x7f\xcc\xaf\x97\xfd?\xbd>\xa0\x80C\xf5\xee?\x81\xfb\xc1\x06\xfb\xe9\xf7?\xca\x81%\x80\x1av\xfe?\x92\xa8j\xcc\x1e\xd2\xe3\xbf\x11\xf5\xe8\x0bs;\xb8\xbf\x94?\x96\x10\x89\x04\xe2\xbf2\xc8\x1b\xfb\xad\x87\xf0\xbf]\xce\xf8!3\n\xef?\xf1<]W\x97B\xd0\xbfJ\xa8le\xc8\x97\xf0\xbfV\x11\x00\x82t\xe6\xce?\xcf\x00\x17e8\x07\xf3?\xd8\xfe6\xa6Cc\xf9?\xcd\xaa\xbf\xc0Y\xbd\xfe?\x9b\x95#i\xaf\x95\xfd?E\x18i\xe2?\xd5\xf1?\x08F@\\\xe3\xfa\xfc?8\xc3\xfa\xaa\xc4\xe7\x04@\xf3\x80V\x0cS\xbc\x03@\xc0\n\xf6\xf4\xc8<\xe3\xbf\x00\x1a]:\xb9\xbe\xc1\xbf\x08\xc9\xb5\xb0\xf0\x8d\x03@=F\xc6\xe9\x90\xb5\x03@\x83\xb9\x9d4eS\xf4?\xedV\xb5pwQ\xf2?\xa1\xc3\xde\xf0X7\xd0\xbf\xbd\x0e)\xe0eb\xfd?\xad[3\xce\xc6}\x04@\xd7\x95\xa2\xbc\xd2e\xe1?\xedc\xd0\xf1.\x06\xc3\xbf\xbb\x98\xf1q\x0f\xb4\xec?\xf0\x06\x99~\xf2Z\xe2\xbf\xfc\x9d^\x19e\xe4\xd7\xbf\x03\xa67\x8bsD\xf2?\xb6\x99\xb8\xbb\x06\xb0\xda?\xa0\xf8\x92\xb8\xef!\xe5\xbfEE4\xfb\x0e\xeb\x00@\xd9Y}3\x92\xa0\x11@\xb2\xe5\x1e\x16\xcb-\xe0\xbf\xafS@w\xa2@\xc6\xbf\xbb\xc0\xc0B\x96e\xf0\xbf\r\xa1^\xc1\xbcF\xf1?b\xbaP\xef\x03\xee\xf6?N;\xc4\xad\xb2\xd5\xe2?C\x12\xb5\x8a\tL\xf0?\t\x8b\x99\xe6\xffE\xd9?\xa0(P\xb4A|\xec?\x0bM\x07\x9a\x01m\xfa?\xb5UX\n3\xe5\xbc\xbf\xaeA\x18\xd2\xca\xb5\x05@\xa8T\xf2`\x92\xfb\xe4\xbf\xa3_\xa8V9\xab\xa8\xbf\x82\xf4c\x19\xc4\xd0\x0b@\x11\xc8\xfb\x1f\x15\x02\xed?\xe5\xe7\x0c\x17\x96\x06\xf3\xbfz\xe7\xbd\xa2\xd7\x15\xee?W\x0f4X\xdb^\xd7\xbf\xe0\\\x83\xae]\x83\xfd?\x18d\xe2\xa29\x02\xe0\xbf\x0e3\x07i{\xe7v\xbf\xaf\x16\x0c\x882\xc3\xb5?o7\xbb\x02\xd7\t\xe1\xbf:\x10\xbf\'\xecW\xed\xbf\xb8\xda\xec\xe4\xbc4\xd7\xbf\x0e_\xa7\xa6P\x10\x9b\xbf\xc4\x9b\xde\xc7\x96D\xf4?\xe6\xb5\x12\xd9\xb1\x95\xfd?\x9ed\xe4a\xf7~\xcf?!\xeb]\x87\x95\xc3\xe0\xbf\xf6\xddq\xe0r\xa9\xd8? \xa5\x07>S\t\xe0\xbfB$\xb1\xc1\xd9`\xf9\xbf\xf4\xb4\xa1\xb9\x80\xa5\xec\xbf\xc0S\x87\x97\x90\x87\xe8\xbf\'\xb1\xee=\x08p\xd4?r\xddsB[\xdb\xf3?\xa7yldQ\x9f\xf1\xbfc\t\x11,g\x98\r\xc0\x17\xd3\r\x81=J\xf7\xbf,\xc5\xbd+\xa2x\xc1?\xee\xd0\x10\xfd\x13\x05\xc5?\xad\xf5\n8ZK\xf9?\xd2S\xe9\xa7uQ\xd2\xbf\xf5\\\xdf\x8a\'\x1d\xd8\xbf\xebC\xb3\x06E\xd4\xd5\xbf\xf3\x9c\xe9\x87\x83\r\xe0?\xedb5a\x85\x16\xcb?2[\xf7\xb2\xb9\x14\xd0\xbf\xdc\xef\xe1\xf5\x15\xfe\xeb?\x83\xdd\x88\xc3\xed\x8c\xf1\xbf\x8d-\x1c\x00\x86\xff\xdc?\xb5\xe4\x7f\xeb\xde8\xde?\xcf\x0b\xd0\x06\x05l\xd6?\x99$\xb4\'\x11`\xee?\xd12~{r\xf8\x03@qp\xc2y\x92e\xd5?\xd4\xd2\xe2(\x9d=\xf8\xbf\x00\xf4\x98\xe0xz\xda\xbf\xad\xe4\x9d\t\xa9\xe7\xec?r\xb6\xe2Y\xf1\xd7\xfe\xbf,6i\xa8`\x80\xe5\xbf\xf7z\xd2\xea\xbb\xc3\x0c\xc0\xab\xda\xfc+\xc7O\x03\xc0\x1cp\xfb\x1d\xba\xdd\xdf\xbf\xc1PS\x8f\xc0_\xb4\xbf\x073\xa9\xceR-\x02\xc0&|hU\xb8K\xf4?\x9c@\\\x82\xe4Y\xee\xbf@\x9f8\xd4UF\xf0\xbf\xb6\xd1\xbdC\xf8\xdc\xf7?\xa5\xf9\xf8I~\xe9\xe0\xbf`R\xb5\xbe\xe6\x10\xe6?<\xdb\x87C\x99\x10\xf6?\xc9\xca~\xc5\x1e\x88\xb6\xbf\x12\x12\xcc\xfeIA\xc8?\xe9u\xfa\x9fr\xe1\xdd\xbf\x87\t[\xe4\xb8\x96\xd7?%\xff\x83\x0e}\x10\xed?a\xda;\tg;\xc3?\x0f\xa0X\x9a%\xf9\xeb?R9N\xfd\\\x11\xfb\xbf\xc1\xc5\xba{B\xcc\xf2?\x8e\xa7\xa1\x16\r\x91\xec\xbf{\xdcO\xf5)\xba\xf2\xbf\r\xff\xde\x8e\x1a\x8e\xf0\xbf\x9dib\x84m\xd8\xfb\xbf>\x0c\xd5\x0fay\xed\xbf\xaf\xb8*\xfc\xc7o\xf9\xbf\xfe\x8b\xcd\x98\xeb\xb7\xe9?T\xea{\xbd\x10q\x05\xc0\xachi\x15\x88.\xf6\xbf\xb5T\xff^\xb3\x9a\x07\xc0\xa2\x85\xbc\x13\xd7e\x03\xc0\xd7&S\x9c}\xd4\xf3\xbf\xa4\xb2\xae/^\x1a\x01\xc0\xe9\x08\x04\x9ez\xc6\x04\xc0!\xe1\xa4)\xf9\xd1\xe9\xbf;\x1f\xb2\xff\xcbO\xe3?|\x9f\x96\xc7\x0b\xcb\xa5?\x8a~\x93qjA\xdb?\xb16\xa4B=U\x03@\xb0z\xb4a>\x93\xab\xbfP\xfb\xa6y4M\xa8?\xd3\x05x\x9d\xbf\xb8\xf1?4\xca\x1f\xee\xea\n\xcd?>d\x0c\xbb#P\xb2?MEQ\'\x0ff\xe1\xbf\xf1\xf2\xabRW\x9d\x96?L\xa8\xe2\xfdT\xac\xe7\xbf\xeby%\xab\x99A\xc9?D1\xe6\xa8\xa8\x85\xd0?\xbbq\xef\xd7\xbf\x81\xce\xbf\xc2#\x83\xb9B\x00\xfc?\xc3\xd92\xd0\xf7~\xe6\xbfF\xd0\xd8~/v\xf1\xbf\x87\xbb\xc0\xce\xd1u\xc6?\x06\x80 \xb3k\xe1\xea\xbf\x93\x91\xb2\'\xe2%\xf1\xbfr\xdeA\x14\x97\xeb\xcb?\xac6\xd7\xfc|\xce\xf1?\xd5\x84\x9b{\xdc\x9c\xe4\xbfYP\x85\x86\xc8>\xd8\xbf7\x014yJ\x11\xdb\xbf\x98\x9a{\xd3\x91\xe0\xec\xbf5"r-Ik\x98\xbf\x82TC?\x7f@\xe5?\x98l\xb4\x98\x9a2\xf2\xbf\xcb\x10JoH)\xd5\xbf\xd2\x9a\xf8\x85\x11\xe5\xd1?\xde5\x1fW\xc4l\xd8\xbf\xf8\xc1\xd5\xb0\xa1o\xb2\xbf\xc4l\xc4h\xc7\xfa\xc3?\xe0\x1f>/o\xf7\xd6?Gr^\x17\x83\xd1\xd2?\xf3\xd7\xc4\xd8XL\xb3\xbf\xdc\x96\xdd[?\x03\xb4\xbf#\x11\x8d\x8a\x03\xdb\xe6?\xc9\xe2\xb6\xa7\x19\xcb\xdc\xbfE\x14lz\xcb\\\xe6?\xcarY\x9b\x91\xc8\xe4?\x03\xc5T\xd1\x82\r\xe2\xbfN\x99\xcc\t\xe0e\xf1\xbf\xe5Ar\xb0_\xcc\xe6?^\xc3\x8a\x91\xf8\xa9\xa7\xbf\x85,\x19i\x1es\xc8?i\x84\x92\xb8\n\xe7\xb0\xbf\x1aZ\xeb\xca\x08\xec\xce?qF\xd9\x15)\xc7\xac\xbf\xe6K\xb9\x13\t\xa1\xdb?%l0\x10\x1d\xdf\xcb\xbfDkyn\xe9\x92\xe1?\xa0\xc7\xb5\xd1\xd3$\xe2?\x9b\xf0\x04\x1db\xde\xd9?S \xb01u\x90\xe8?\x80\xb8\xc6\xb0\xe6O\xf2?\xcb1\x17\xa4L\x8b\xeb?2\xa2q\x15 \xad\xcc\xbf\x03p\xd6\xfa\xd3\xa0\xad\xbf\xc9\xe9\xdd\xf9$\x80\xda\xbf\xff\xebt\xde\x01\xb3X\xbf\x93%\xe9#\t\xc5\xe9\xbfv)\x95\n \x14\xe5?\xb1\x0b\xc6\xee\xb0$\xe3\xbf#``\xfe\x0cq\xb4\xbf\xa0<\xfa\xde}\xaa\xf5?o\xda\xc2\x01\r\xf9\xd6?\x0e\xab\x163\x14]\xd1\xbf\xb0q>\xff\x014\xe8\xbfX\xa1r\x98\x95s\xe0\xbf\xb8\x8a\xd6$\x051\xf5\xbf\x84p\xd7.\xb4\xb3\xf6?\x11\xa1K\x16\xa4X\xf3\xbf\x02~\xc2\x12A\x81\xbf\xbfW\xcc\xc9UQ\xdb\xe0?\xdf\xeb\xe4\xc2\xa5F\xf8\xbf\xa3$Iw\xf6\xe2\xe3?\x01\x19\x7f\xac\xd7\x97\xe2?\xec\xcfH5\xc4e\xf0?d\x84?\xb5O`\xe3\xbf;\x1d\x96xuo\xd0\xbf\x90\xab\'\x81\x1f\xc8\xef\xbf\xae~V\xf8\x08\xef\xeb?2\x04j<\xb9\x0f\xed?~c[\xb2\x11\xa6\xe0\xbf\xab\xe73\xe3\x9a\xef\xcb?\xe7\x1b\\\x06\x04\xcd\xde?N\xcf|\xd6\xafj\xd2\xbf\x14\xa7`\x94\x15n\xf1?k\x81\x01\x89\x86\x82\xf7\xbf\x9ds\xe4\xe9\x81\xa8\xfb?\x07:\x90R\x8a\x19\xa5\xbfTQ\x0fB\x8eI\x93\xbf\xb9(\x1fk\x8a1\xf2\xbfo21aZ\x8d\xf2\xbf\xb86\xaa\xe3ze\xd8?a\x14\x83\xe9s\x04\xe7?\xcd\xc9\x0cV\xe4\xde\xe4\xbf\xd3M\xde\xad\xd3\x05\xeb\xbf=\x1b\x0f\xf2\xdb\xce\xe9\xbf\xb6\x82u\xaa\xf5\xa4\xc9\xbf\xb5\x8f\x9c\x86R\x9f\xea?\xc0\xa73kh6\xd6?\xdf\x1e"\xca\xac\x8e\xc9?<\x1d\xd5\x18g\x18\xe7\xbf="\x81:N\xdd\xed\xbf\xfd)\x85\x96\xee\x05\xe8?n\x1b\x80J\x16\xd4\xdd\xbf\x97\x1a\xd4\x07\x19r\xce?3\x13\x0e\xe2h\xec\xd6\xbf\x95\xbdHVa\xc7\xd1\xbf\xe0\xe13\xd3I+\xd5\xbfa\x00\x03\xc9\xd9\xf4\xf3?A\x8a\x16\xfaS\x1f\xe3\xbf\x06\xdf\xee\xba\xc0\x0b\xc5\xbfV\xd0o|vz\xfa\xbfc\xc4\xdfw\xe1\xfd\xdb\xbf1\x01Na\xe7\xc5\xe0?+\xe2\xaf\xe8\xa0:\xbe\xbf^M\xeb\xafX\xcf\xcd?\xd4\xef\xb2<\xae\xb1\xea\xbf\x89L.\xf9a4\xf9\xbf\x0c\x9a\xd8\x94\x017\xd2?$Y\n\x95\xe62\xd2\xbf&\x1f\xf787\xff\xf9\xbf\xdby\x0e\x13\xb7)\xe0\xbfn\xa6\x12U8\xff\xb2\xbf\xb6\xf0\x0b]:\xdb\xe3\xbf\x1d\xa9,\x9dJ_\xf4\xbf\x90&w\x86\xf37\xd3?@\xca\xa5\x9b1=\xf7\xbf\\U\x8a\x0b\x8e\xe3\xd6\xbf1!^\xe3\x03\x1e\x01\xc0\x13\\gwA\x05\xf5\xbfg\xe7\xeb#\x12\xc6\xec\xbfk\x94X\xc8\xcc\x07\xfc\xbf\xac:\xe8y\x87\x1d\xe1\xbf\x93Gz\xa3W{\xe9\xbf\xc3\x05-\x88\xf6L\xf7\xbf\xa8\x1b\xa1\x1b\x04\xe6\xaa?\xa0aC\xa4\x18\xdc\xfb\xbf\xa3\x8c\xf5-t\x7f\xda?\x85\xd7\xae\xc0\x04v\xd9\xbf\xb77\xb88\xd8\x19\xf4\xbf\xf8\x9dW\xdcJ\xac\xf9\xbf\xfd\xca\xfe,S\'\xe9\xbf\xfe\x1dd\xecf?\xf2?\xab><4\xb5\xa7\xa2?\x06\xf4\xdb\xf2\xec\x8d\xe1?~9\x94\xe4\xf7\xc7\xd7?F\x18\x98\xc3|\xbf\xf3\xbfu\x88\xbc\xbf\xa1\xdc\xd4\xbf\xbboEO\xf9\xf4\xbd?R8uFs\xd6\xfd\xbf\xc1\xac\xe4\xfaY\xd4\xdd?\xb7\xd6\x85~\x8f\x0b\xd2\xbfp\xee&\xae\x8b\xa7\xef?\xbc\xf1\x97\x8e\xa5\x98\x02@\x01\xde\xd0"\x17\xf3\xec?\xa2\x08W\xb1|?\xc9\xbfDeEd$\x1e\xf4?2/\xb0\xf0\xadR\xd9\xbf&\x9b$\xf2\xb6[\xe2?\xf1\x9e\xd6\xfa\xa5\x1a\x01\xc0\xcbU\xb9[\x8c\xa4\xfa\xbfi)p\x88\x88\xe5\xd2?"8\xe5\xb4@B\xf5\xbf(\x1e\xbb\xb2Jr\xe4?b{I"xb\xf1?\x1e\x0b\xf3\x12^\xd1\xc1?\xeaR\x9f\x911\x83\xe7?:\xf7\x0c\xf5\x0b\xb8\xf3?\xf7\xd6\x99OL\x89\xc7\xbfn\xf32\xc6\xb4\x86\xd6\xbf9\xd7\xa3i\x8c\xb7\xd5\xbfX\xd2\xa7G\xe6\x8a\xc4\xbf\x85\xb3\x8f\xcf\xbd\xc4\xd7?s\x97\xb3\x06rB\xda\xbf:\x1fY\xfe\x05\xaa\xe5?8\x13\x19\xbfO\xe6\xf4\xbf\xb7\x081~7Q\x00@\xc7<\x01\xf1\x0c\x8c\xc0\xbf}\xe8=F\xc6\xa5\xdc?\x91.\xb5\x10\xb5*\xe1\xbf\x8e\xc8[\xf9\xa7\xc1\xec?\xef\xcd&)\x19g\xfa\xbf\xbb W?ed\xd6\xbf\t\xd4\xd2i/ \xc6?\xa4W\xba\xac\xd2\x81\xeb\xbf\xea\x9c\x91\xf7\xb6\xbd\xfc\xbf\xda3 \x9a\xca1\xca?FG\xa3\xe7O\t\x05@\xe6\xb77\xeb\x07P\xe1?\xd2\xeb\xfb\xddB\xd7\xf6\xbfs\xfddD\t\xa9\xee\xbfa\xc5,\xe8\xb9?\xda?\xa9wr\xcf\xaeH\xe4?h\x9dw(\x11A\xf4?\xa3\xe8(\xb9=s\xd5\xbf\'\xff\x18\x9b\x83\xf7\xbd?\xd3p\xda\xb3\x94(\xd6?\xe8\xf8\x19\xdb+\xd7\xe1\xbf\x00\xc5}\x0c\xbd\xbc\xf5?M\x91{\xb4\xe6\x96\xf4\xbf\xf7\x97\xaa\x18L2\xf6?7\x04A\x8f\xf4\xc6\xe7?G\xf1\x9b\xf9fU\xfc?\xd3\xc04F\xed\xe4\xba\xbf\x04\xe7\x84j\xcb_\x91?,\xd6\x11~\t\x81\xef?L[\xfc\xe9q&\xe4?x]\xbf5\xe2~\xf4?\x0c\x15I\xb9\x14$\xfb?\x0f\x11\xb3\x83\xf4?\xd0?3\xd5\xb7\x0c\xbf\x10\xe2?\xd7o\xf0\x89u\xd4\xf7\xbf\x90\x1b\x1c\xa2\xdc\xaf\xd2\xbf\xcd\x11\x05)mG\x00@\xdd\xc9\xa6yV_\xec\xbfY\xb9\xfde\xa9/\xea?\x03\xf5\x03l\xa6m\xcf\xbfk\xd3\\\x11\x15\xa7\x00@5XE\xbe/\x9b\xa7?g\x1148\x13\x16\x85\xbf\xda^Q\xa6\x0e\xce\x00@Q\x94\xfe\xddK%\x06@FA\x1d\xb5q\x92\xdd\xbf\xd3\x85\x8ae\xd3O\xf4?\xc2\x93\x92;\xa0\x8a\xc9?[\x14\xa5\x17\xc11\xe1?\xe1\xe5\x08\xcd\xeb\xfd\xc5?\x9e\x0f\xd0\xa9\xe2\x0e\xea?n\x99G\xcfp\xd4\xf1?\xd5)\xe9\x91u\xee\xc9?\x01f\xd8~\xc4]\xf1?\x8e\xf8\xad\xce\xab\t\xf4?^\x0b\xe2t\xd1:\xef\xbf\xbfa\xe5\xf5\xad\x10\xf4?1\xc4U+\x86F\xc4\xbf6\xe2i\xdb\xd8d\xee\xbf\xcc\xa6\x12\xad\xeeb\xf0\xbflw\x0f\x07\x07)\xf1\xbfm\xce\xef\xbe\x14w\x00@f\xa7\xafo\x8d\xe0\xfa?\xf6\x12\xa1\xf3{;\x02\xc0\xc9\x01\xe5\xc1\x95\xe2\xc4\xbf\xc8iw\x01\x91D\xe0?\x19\x10\xec06\xa7\xe4\xbf\xd6\xbd\xe4@\xf4\x86\xf6?\xff\xde\xa7(k\x85\xfe?\x0c\xf0Z\xe4\xf2\xaf\xf8?\xf4\xf5.`\xf4\x8c\xcc\xbf \x86z\x005B\xf1?&\xd3[\xab\x8be\x13@/\x158\x9eX\x91\xf9?s\xf7\x02\xd1R\xc9\xf5?#\xd9\x1fi\x8d\xd7\xcb\xbf\x1d\xc7\xa8\xdb\xba\xc5\xd2?3:\xdb\xa6\xc1\xb6\xc8\xbf\x9f\xcc\xe4\x01\x19\xb9\xea?\x99E\x881y9\xeb?\xbb\x9a\xbf\x94\x1fB\xb6\xbf\xdf\x90\x1f\xc9\x1e\x1b\xca?5\xa9+\x07\xf4\x1a\xf0?\x1c\x7f\x1d\xae\x04\r\xc2?\xf1\x8c\xa6v\xe8\xd9\xf4\xe4?\xe9\xb9\xe9\xf0\t\x98\xda?\xf2\xde\xf3U\x073\xe2?\x869\x15 \x92\xf3\x05@\xaf\x83\x96\xa4^\xe4\xc2\xbf\xd0\xd0\xe8\x07/w\xdb?\x1b\xb90\xc1\x07\x83\x04@a\x8b\xcf\xc4\x80\x98\xf9?\xac\xc5<\xd0,\x95\xf9?U\xee\x8ay=\x9e\xd7?\x9ec\xe9\xe7\xc7H\x06@\xb9\xdbC\xe9\xec\xb3\x14@\xcfg\xdb\xad\xc4\'\xfd?\xd9\xf8 \xbd\x89\xd4\xec?d\xe9L\xeb$1\xd2?\x9e\x05\x87\x03\x87\xfe\xf3\xbfP\xd6\x1f\xa7|p\xda\xbf\x99\x815m>a\xe7?\x0b\x16\xc9J\xed\xf8\x03@o\xe6\xb3\xb6L]\x02\xc0\x12\x7f\xe4\x94\xadE\xd7\xbf\xc0\x94\xfe\xb3\xdc*\xdb\xbf\x0fH\x1f\xe1\x88%\xf5?\x90G\x86\x90\xcf\x99\xfe\xbf\xa1\x04\xf8\xf3\x17\x18\xf2?sY\xdaC\xbf\x96\xd7\xbf|\xb3W!-,\xd5?\xca\xec/\xa5\xa26\xfe?e\xa3G\x1d\x92\xfd\xee?\xa7\xad\x0e\xb2JN\xfa\xbf;\x9d\xd4\xf1\xfe#\xe4?\x90\xaf?\x96\xdb\xde\xf5\xbf^=\x1bb\xb7]\xe8\xbf\xdbiX\xb9 )\xfd\xbf0\xd62e\xe4=\xf2\xbf\xc1\x86\xaa\x93\xd6_\xd6?p\x9c\xcc\x15\x9d\x0f\xf6?\xb5-\xacN\xd3\x98\xb6?\xad\xc8Do\xbf\xfb\x11@\x8c\x98\x8e:!W\x19@\xc6jt4\x03v\t@\xb3\x08\x063\xf8\xa1\xe0?\xbb\xdc\xd6?P\xb0\xe5?r\xf1\xfa\xbaC\x82\xce?\xce\x8fn&!\x01\xfc?\xb3\xdb`\xd4\x80G\xdb?\x17\xab5\xde\xf6\x88\xe8?\xcf\xb2\xe2;\x16\'\x10\xc0:\xd2-\x97\x8b\xa9\xe5?i\xdfa\xb7\xa2L\xfb\xbfo\x1e\xc6\xf7\xc37\xa1?\xba\xc5kED\xc5\x80?S\x0e\x08\xacc\xc3\xef\xbf\x80C\x7f\x0f\x0e\n\xfc?\x8d\xf1*\x87\x8f\xfd\x83?\xc4]Wd\xa77\xc9?\xec\x060iu\x06\x00\xc0m\x9b\xae\x17]M\x00\xc0\xa3>a\x13\\\x19\xfe\xbf$\xdc-5\xf8p\xf1\xbf\xaf\xeb\xb3\x03\xc1i\xf0?/\x03,\xb5\xe6 \xff\xbf\x0f}\xda\xe1\x9f\xf0\r\xc0\x19\xec\xcc\x11\xb6\x88\r\xc0\x18j%\xecA|\x01\xc0\x8a\xd8\xe7B\x827\xce\xbf\x9e\xfa\x18]\xae\xcd\xee?\x05\xf1\xd2\xcb\x9e\xe0\xf6?\xf4e9\x07\xf0-\xf9?\xa2\xff\x8a\xc8\x84|\xea?\xa94>u\xc2Tp?\x84\xbd=BDG\xf0?9a\x84;4\xb3\xe9?\x86\x7f\x81\xa9\x94C\xf4?Ur\x1a\xd8\xfa\xaa\xea?\xe5\x7f\x82\xb7\x95\xe4\x05\xc0\xb5\x11:/|\x8c\x02@\x16lCft\xf6\xfd\xbfm\x82|\xb2f\t\xd3?\xda\xdb\x7f\x01\xb8}\xed\xbf\xfe\xe5\xa7f\x171\x01@\x13o/\xb9cq\xf2?\x80\xdf\x958d\xeb\xfb\xbfx\x80\x88\xce3\xeb\xec\xbf>j.\xddR\xcb\x02\xc0L\xb6m\\\x83h\xf5\xbf\xab\x10\xef\x13\xc7\xc8\x01\xc0\xb7\xfc`~\xdd!\x01\xc0\xb9m\x98rts\xf7\xbf\xdf\x1e\xe6\x8a\xf0\xc9\x07\xc0\xd6L4?\xa9\xd7\xf2\xbfV\x9d:\xf7q\xc7\x11\xc0\x134%\x81\xc7(\x03\xc0\n\xb7G[PF\t\xc08}\x93\xf8D\xd4\xf0\xbfY*\xef\x8c\x1d\x10\xf0\xbf\xe2\x9d\x0b\xed\xc0\x9d\xd3\xbf\xf4\xa9\x88\xf8\xe5\xb0\xb1?\xbe\xc9\x94\xa0\x87Q\xf1?\xf1\x10#\xb6Y\xfe\xf6?\xe9R\xd9W\xd3I\xa7?_\xf9\xde\x18(n\xf7?\xc377gRU\xe5\xbf\xba8H\xacM\xe8\xd5?\xeb\x82l:\x8c\xba\xc5?\x02\xe6\xf4\x06\xec\xc8\xda\xbf\x0e\xd4\xb8\xd52\x18\xd9\xbfs\xf8\x91\xe2\xc2\xb1\xfd?\x81\xbf\xc0\x84\xbfB\xc9?\x8bQ\xe8n\xcc\xb5\xdd\xbfZ\xd6\x95\xa7\x8e\xd4\x01\xc0\x0c\x19Y]o\xd3\xe0\xbf\xf1\xa6]m\x8c\xf0\xf4\xbf\x91\xf8\xe1q\xd1\x1a\x14\xc0\xda\xe9K\x1a_Y\x04\xc0\x7f\xcdB\xc5f\x87\x01\xc0\n(\x9a\xb7\xea\xcd\xe4\xbf\x1b\xbf\x03\xf6\xa8d\x01\xc0\x05\xf7\xa5\xb7\xd5\x8f\t\xc0\xb5\xb5>\x15S|\xf5\xbf\x06\xd6\x90,\xe96\xf6\xbf\xd3\xd6\xef\xb8\x93\xe0\xf2\xbfv\x11\xe4[1|\xfc\xbfT\xb1\x165J\x10\xea?\x95\t`\xe0DJ\xe2\xbfH\xde;\xba\xf0B\x96\xbf\xb5\xe1\xc7\xc7\x8d\xc2\xde?\xee2o\x95\xf0\\\xeb\xbfm\xa4\xce~\xe5\xa0\xf0\xbfI\xb1\xcd!\x8d\xf5\xdd\xbfJ-\xb2\xdf>\x0e\xd4\xbf\xe8\xc9\'\xee$\xa9\xe7?\xf1YW\x92\x15\x0f\xfa?\xe8Aj\xab\x87g\x00@\x94ig1{D\x12@V\x8a\x9b\xb5\x9e\x03\xff?\xe4\xb4\x0cN\x81\x99\x00@Gu3\xd1\x98\xa3\x03\xc0X\xf8+0\xa4}\xf0\xbfq\xefOR\xe0\xff\x01\xc0\x0c\xfd\xf2\x93\xbc\x8e\t\xc0{Ua~x\x7f\xf7\xbf\xfa\t\xa9\xb6\xcd\xdc\n\xc0 \x90.\xb5\x19Z\xf5\xbf\x9dt\xd6#\x02\x1e\xdf?\xff\xcf\xb7\x8fV\xa0\x0b\xc0\x03\xa6Y\xa1\xaf$\xfa?\xeb\x95\xaa\xf2\x9fx\xf6?\x92bL\x88p\xc0\n@N\xc03\xf2\x9cb\xfd?+\xc5\x07\xbd\xc6R\xea?mJN\x97\xfa\xe3\x01\xc0.$\xba\xe8A\x9a\x8f\xbf\xe9!\xdc\xfe\x81G\xe6?\xcd\xf3"H~\xa0\xd0?\xf3\xee|\xe6jd\xeb\xbf\x10\xf4\tt\x98\xae\xf2\xbf\xd2\xf7\xd3\xff\xd0\x93\xee\xbf\xd02\xf7\xd8\x91\x1b\x04@\xdbO\xef\xe6\x1a\xa9\x0b@\xc6\xf0N~#\x16\x04@,Jum\rP\xfc\xbf\xd2\xd5n\x93\xca\x9e\xfa?\xe7h\xdd\x8b\xfb\xa9\xeb\xbf\xa0\x94\xcb\xf1\x8d\xc2\xe4?2\x018@\xd8\xd7\x0b\xc0\xd9\x14:^;`\xf7\xbfi\x94\xe5c\x0f[\xee\xbf\xf7j\x98\xe1O\xa4\x08\xc0R\xf4\x19\xba\xfd\x06\x0e\xc0\'\t\xd5\x9d\xed.\x04\xc0\xca\x95\xcf\x9a\xad\xaf\x0b\xc0>\x1fR\x15\x1c.\x07\xc0\xa8\x9e\xf2\xb3Di\x0b@\xd1\x92\xfa\xc8\xd0\\\x13@\x9e\x02\x1e\x01*\xcb\xca\xbf\x81\xa8|f\tI\xc8?\x10\x80\x94\xa9"g\x08@\xd8(}u\x14\x13\x02@%\x0f\x90\xc7\x85U\x04\xc0\xa7\xe6^<\xb7i\xec\xbff\xe9\xd6\xee\x95\xa3\xec\xbf\x13\xf7Z\xadx\xe2\xe5\xbf\x16]}\x07\x84\x1b\xf7?\xdb\xa24A\\\x15\xe4?#/(\x850\xed\xe5\xbf5w\xaf\xa0\x80r\x02@\x83AD\xcd/_\x04@\x08Q\x92\x14i\x06\xe9?\xe4\x0cn\x98\xe9j\x06\xc0\x08\x98}r\xdc\xdc\x05\xc00\x14S\xf4\xdc4\x0f\xc0\x99\x19\xe3~\xfaA\x03\xc0\xf2LD\xf5\x93\xfd\xf9\xbf4\xa2r\x17\x80\xb1\xfb\xbfM\xea\xe6\x1f\x89\xc0\x00\xc0\x9b\x89\x82\x8e9}\x13\xc0]\xd2\x97\xd4\x1bG\x06\xc0\xcd\x1e6\x90\xbc\x81\x04\xc0\xe5\xf41w\xe5"\xe5?\xff\xfb\xac\x86\x8a\xa6\x03@\xfb\x95\xdfmPl\x03@O\x94\xf3\xd2\xce\xfa\xf4?\x91\xbe\xbb\x18@A\x03@BS\x91J\xe6\x93\x0c@\x02\x84\xd8\xdf\xd8J\xc3\xbf\x8a}@\xeaR\x9c\x01@\xd3>\x19\xe3\xf0\x0f\x07\xc0\x9d\x8a#D\xac?\xe0\xbf\x9e\xa2\x1dTc:\xac?\xdarL\x0fo#\xde?)#\xbeR\xa8\x8e\xe4\xbf\x08\xb5f\xfd\x08\x99\xb7?\xb7c\x86\xc9g\xe1\xd6?\xee\xa2\x81\x8e\x14<\x02@v\xaeh\xedjG\x12@\xf2\x8dx\x0c3d\xd6?\xeaaO\x86\x03\xc9\x04\xc0\x1c\x9c3\xadi\t\x13\xc0\x8e\x19\x96\\b\x13\xfe\xbf\xd8\xb2\x92\xf4K\x01\x15\xc0-\x1e\',_:\x10\xc0\xf3T;\xdf-\xf2\x04\xc0\x14,=\x89d\xb8\x1f\xc0\x06wZ\xcd\xb7\xcd\x1c\xc0\xe9\x96@ \xb8!\x0e\xc0\x15\x91\xf9\xd3<\xa2\xc4?\x9b\x95\xdd\x84E5\x06@\x96\tE\xc0\xf2\xf8\x10@%\xe8~\x86\x88\xd7\xfa?@\xf7\r0H~\xf8?\xeb\x88\x1e)\xb53\xd6\xbf\x10\xfd$SH\x99\x01@=;\x8a\xb9\xa7\xd6\xcf?\t\x02\x98*\xa8\xbf\xe8\xbf<"T\x8a\xe00\xb2\xbf\xcb{\xe6\x15?\x9d\xd3\xf4?\xb8dE7\x14\xcb\xde?\xf45\x89gZl\x03@\xab#\x0559\xa0\xad\xbfj\'\xfd\xd5\x94^\x07@\xf26\xc0\xa2\xd6[\x00@\xa6\x9c\xeaT$\xc3\xf1?\xbd5\xee\xa7\xcb@\xea?\x18\xaa\x908B\xdd\xeb?\xfe\xc2r\xa2R\xaf\x9a\xbf\x081\xd1\x928\xfc\x04@\xcb\xaaD\xcd\xe9\xeb\xf9?(\x16;5_u\x03@m\xc9~\x8b\xe0\xc5\xf9\xbf\x90\x85\x1d\x9a\xdal\xce\xbf\xa1\xe8\xac\x07\xb0\x9e\xea?\xea*C\x97o8\xd1?\xb5l&\xe1\x99\xc8\x01@H\x84\xd5\x086J\xd7?=\x9e\xed\x08+\x95\xe1\xbf\xdao@\x94\x18U\xeb?\xcd\xd7\xc1\xd8(\x0e\xdb?P\x15|}f\xa2\xcf?\xce\xde(*B\xe6\xe9\xbf\xc6\x81\x86\x98\x86\x07\xeb\xbfU\x1b\xb3=\xdcn\xe6\xbf\xa9\xfc\xb2\xc0\x11L\xde?\xfb\xefFV\t\'\xf9?^!\xfe#\xc2\xdb\xe3\xbfL\x91\x05g\xb2y\x03@Ea\xba\xe4.\x10\xe7?"Ue\xd40c\xf4?\xa8\x80X\xe7r\xc9\xeb\xbfb-M\xec\xc0\t\xf2\xbf\xa1\xf3"\xa0\xee \xf3?\x07\x91O\x86\x9c\xa5\xd9?\xa0\x06\x92\xd7\x0fX\xfd?\x82\x16\x81R-J\x07@\xbb\xf3$B\xcc\x02\x02@\xe6:\xc5\x9a\xac\xfc\xeb\xbf.b\xab\xdd\x1b\xad\xe4\xbf\xfa\x98\xbc\xa0,|\xe6\xbf?\xd4?\xac&p\xe3?9\xe3:\xde;\xe9\xe3\xbf\x9b[\xc7\xf2\x9f\xa5\xb2\xbf\x02\xb5\x89\x11\xfe\xc2\xce?[\x1b\x9blo\x8a\xa1\xbf5\xa2\x89\xa9a"\xbc\xbfIDn\xd6\x1a\n\xd0\xbfLy\xa9z\xd1\xe9\xf4?\xa7{\xb5\x0b:}\xda?\xb1\x0e\xdf\x95{\x03\xfe?5\x8a\x0c\xa1\x0f\x9f\xfb?\x87\xc8\xb9\xa1p\x0b\xaa\xbf\xd3\xdb\x0b~\xbd\xbe\xe2?\x9d\xc8X\x07Y\xd6\xf0?v\x84\x9f\x1b\x05\xe8\xf9?\xc9.Px\xc9Z\x01@\xc3\x1c;\xe9\xce\xcf\xd5?\xd3\xe5L\xcc\x91\x13\xd6\xbf\x0e\xa5\xc63T2\xf6?K\x11\xe6\xba\xe6\x89\xf0?>\xc8|\xa6JG\xed\xbf|^\xc3\xeb\xe8\xe7\xbf\xbf\xb6\x9dO\x88\xfeu\x03\xc0V\xaf\xcb\xc3\xc5\xf3\x01\xc0\x99!J\xd6L\x1b\xab\xbf\xcc\xda\xbc\xa5=/\xfc\xbf5\x93f\xf1\r*\xdd\xbf\x8cK\xe7\xefm\xed\xac\xbf\x07\xe3Z\xc0\xad\xb5\xe2\xbf:\xae\xc9\xa9o\x0e\xe2\xbf4\xa9\xc2\x0eQ \\\xbf\xfe\xba\xca\xd6\x10"\xe1?\x0c\x03\x97X8`\xf3\xbf\xbd\x8ePaj\x9c\xf0?\x04hl.\x95\x00\xb4\xbfl\xc8zp\xe9\xb5\xcb?\xc4\xdb6\xb0\x13\xc3\xf9?q\xd8[{\xb3\xeb\xf3?\x1fu\xb6[\xd8\t\xf7?h\xac\x1b\x01\xf2\xaf\xeb\xbf\xf1\xf8;\xdch?\xe8?5\xbd\xa2\xcb\x14\xc2\x12@"\xd0\xe3\xd4\xbb\xe3\xf3?Xv\xd6\x19-P\xc0?sY%xml\xd3?*\xc6\xac\x19\x91\xe6\xe8\xbf\x1b\x7f\xf0G\x8e\xb9\xfd?\x81\xedK\xe7\x04a\xe1?\xd1\xd3\x05\x9e\xc94\xd4?\xe9\xd3v\xf9c\x8b\xec?\xd4,\xcfX\xf9\xb8\xe4?\x0f \x1a\x92\xd0\xbd\x05\xc0B\xf6\x82\xc7\xae\xe8\xe0?J)\n\xadG\x9e\xce\xbfFA\xb5_!\xfc\xca\xbfm$\xbd2\x85\xbe\xd6\xbf\xb0\x16\x10\t\x01N\xea?\xd9K\x98\xf7\xc5z\xf2?F\xfa\xa3\x1c\xafJ\xe3\xbf\x9c6m#%\xb7\xd9\xbfj,\xe1\x11\r\xa1\xeb?C\xa4\x0eJ\xc7v\xeb?\xdc9[\xfc\xcfP\xdb\xbf]`7F%\xc7\xf2?\xe6\x96z]\xd3\xfa\xe8?\xca\xe4\xe2\'\x0b\x93\xe3?\xf1\xd8\x9c\xed\x0f\xe8\x07@\xd161\xc7\xd8\xc8\xe5?_\xab~\x0e\xd8_\xef?=\x0e|\x83\x84\xfe\x00@F\xc1\xc1\x1e\x1f\x08\xed?\x83\xb2\xb1\xa5$\\\x00@\xe8f\x8d/\'\x15\xd0\xfc?\x9e}\x8c\x8b\xb9\x9a\xaa?\xd20\xc5\xc6\x99\xcd\xec\xbf\xffc\xd4[\xc0\xc4\xaf?C\\r\xa5\xcbZ\xc9\xbf\xdb\x01<\xcc\xe0P\xfd?\xba\xb1\x85\xe4\xdb$\x01@5u\x9e\xcc;\xb5\xe7?\x15R\x06>S\xbd\xf6?\x1a\xb3y\x86\r\xc7\xfd?\x13\xb6\xf4\xc0\x12\xee\t@\x07\x1a\xd3\xc0\xf6\xe8\x92\xbf\x1b\x90\xb9\x94\xfeB\xe5?\x7f\x08b\x97\xd8M\x02@\xb8\xef\xb2\xdc\'\x03\xe0?w\x84\x83->D\xd4?d\x96\xf3\xd7\xb5\t\xc2\xbf\xc10\x01w\xe4\x91\xef\xbf\x96\x88\x04j$l\xe5\xbf]\xc26\x03dG\xeb\xbf\x9a\xe1^\xa1\xff\x01\xf2\xbf\xa5\x0b6\x9c9\xb5\xc0?\xa4\xca\xc5\xa5\x14m\xe1?\xa1wf_U\xd5\xb6?_\xa3\x05\x86x\x9c\xd9?5\x8d\xc1]%v\xf4\xbfv\xf8_\n\xd2\x07\xde\xbf\xd8\xbf$L\x7f\xd9\xc1\xa0\x00\xc0\x96\xf0m\x8d0\xb6\x00@_7\xe3\x82\x87\x8f\t\xc0\xc23\xb9M+{\x04\xc0\xee\xb7\xdc1\xac\xb5\xff?\xa8\xeff\xa8\xa1X\xd1\xbfLC(8\xee\x97\xbd?\xc7m\xcb\xef\xbc\xf4\x1c@U\xfa_p\x8bV\x00@`\xa3\xb5\xa5u\xc9\x11@\xf42\xe2#\xc0t\x17\xc0\xaeM\x18WT\xea\xf8\xbf5\x98\xcb\x01\r* @\xb9\xe5\x85\xc7L*\x00@\xdc!\xa5a\xd4\xf9\r@d\x01*6\xa4\x8d\r\xc0\xac\x007\xfc\xa1\xfe\x0b\xc0zj\xc0l\xa55\xdb?\xb5\xd4\x9d\xde\x84\xd0b?s\xff:9\xf3j\x15\xc0\x96\x1c\x0b\xd2\'\x1c\xf2?F\x06w\xc6\x02\x98\x1a@F\x04u%8\x95\xfa?\xa1\xbd\xa3<\xea\xc2\x01\xc0K\x9a\x8d\xe2\x8c\x0f\t\xc0]G\x16\x9d\xb5\x14\x1b\xc0\xad@\xc1v\xa3\xec\xee?\xe1\xcb\x82[\x8f\xb0\xf8?h\x7f\xb0H\x12\xca\x0f@\xab\x08\x0b][\xbe\n@i\xaa\xd8\xce\xb6r\x16@"\t\x8a\xdfA\x91\xf9\xbf\xdd\x1f\xa8\xba\x9dM\x1b\xc0\xb1\x97\xb2W\xd1\xd3\x12@\\\xaf\xa6m\x99\x87\xfc\xbfO\x8c\xd2\xe3\xae#\xbf?\x81n\xeb\x04\xf7\xba\xe1?\xc6\xee\xd9\xb8\xc01\xf9\xbf\xd5\x1f\xe7\xa8\xfdY\t\xc0\x8f\x87\x04\x1bZ\x9b\xfb?\xe7\xf6\xf7\xa1]\xc7\xf8\xbf\x00\xffCh\xb0\x9f\xe7?\xf1\x87Q\xc9m\\\x17@\xe4C\x82\xe1\x80\t\x05\xc0\x7f\xde\x92z{{\x0b@W\xe6\xc2\xdby^\x03\xc0\xcc\xf0\n}\xdbx\x05\xc0=\xa6\xf3\xa9\xfdE\xfd\xbf4q\x85=.\xbe\x05\xc0\xc2\xa0\x19\x10\xdcl\x08@\x14\xaa4\xce\x14\x86\xfa\xbf\xaf\xcc5G\xf0\xd5\x1e\xc0P.$^\x94\x9d\x11\xc0\xc8\xaa\xca(\x8f{\x0f\xc0:q\xad\x1b\xf9Q\x01@}\xde\xf6\xa3\x1a\x1b\xea?\xeb\x19\xc0J\x11\xb2\xb8\xbf\x92\x8f8\xfb\xdf\xe6\x1b\xc0q*\x02e*\xa1\x06@\xd4\xa7\xc5F\\\x18\x02\xc0\xe96\x10\xe4\xb4D\x0f\xc0N\xfc\xc8\xfd:\xf6\xdb\xbf' +tbg1 +(g2 +(I0 +tS'b' +tRp7 +(I1 +(I10 +I1 +tg5 +I00 +S'\xad\xe6(\x12\xef\xd0\xaa\xbf\x7f\xbdB\xa0\x82\x8c\x1f@\xe6\xd7\xef\x00q\xbc\xf1?\x1d\xab\xfa\x9a;\xe9\xb0?E\x0b24\x10)\xf9?\xf9P\x86\xf7\x00\xd0\x10@\xde\x89\xf0\xf1\x8c\xa5\x0b@\x18\xeb\xf4N\xf1\xaa\xf3?\xd64\xd7\xc7\xf2F\x00\xc0N\n\xdf\x08\x14x)@' +tbg1 +(g2 +(I0 +tS'b' +tRp8 +(I1 +(I10 +I1 +tg5 +I00 +S'\xcd(\xef\xf6\xae`\x0c\xc0\xd83\x80\x90`\x9e0\xc0\xb9\xdc1\x80X^\x1a\xc0\xcc).\x98Y\xe0\x11\xc0myx\x94\xf6\xba&\xc0\xde3M%\xd2\x8f$\xc0\xacQx\x89\x06\xc1%\xc0\xfb\xaa \xec\x9en\xf3\xbf\x1b\x8b\xf0H/\xf0 \xc0\x90\xf7\x0c$\xc3\xa9\x94?' +tbt. \ No newline at end of file diff --git a/samples/Pickle/random.p b/samples/Pickle/random.p new file mode 100644 index 00000000..ff3ab064 --- /dev/null +++ b/samples/Pickle/random.p @@ -0,0 +1,36 @@ +cnumpy.core.multiarray +_reconstruct +p0 +(cnumpy +ndarray +p1 +(I0 +tp2 +S'b' +p3 +tp4 +Rp5 +(I1 +(I100 +tp6 +cnumpy +dtype +p7 +(S'f8' +p8 +I0 +I1 +tp9 +Rp10 +(I3 +S'<' +p11 +NNNI-1 +I-1 +I0 +tp12 +bI00 +S'\x1cc~\xc3\xa7r\xed?\xe5${\xec\xd6\xcd\xed?\x809-\x02%\xa9\xa2?F\x0f\x1d\xe8\xef\xa3\xdb?\xfe\xd1\x0c\xb7\x83\x13\xef?\xe0\xfcO\xe5?Y\x97\xcb"\xa7%\xe7?\x9b\x8d\x16\xda\x97\xe1\xeb?T\x14\xbd\xfe|\xf4\xd0?\x18\xdfH\xc56A\xba?\x90\xc5\xfb\xc63:\xe5?\xbf%\xad\xe5.\x86\xe9?\xc6\x0c\xa9\x8c\xd7\xd5\xe9?\xf8\xafc:\x84g\xd7?\xf8\x98\x879\x9a\x16\xee?\xba\xdf\x88\x8az\x06\xe2?~g-\xeb\xc8\xed\xee?\x08A\xcc\x8c\xe7>\xef?\xceD\xc4ar\n\xdc?\x92w\xbb\xa34\xb1\xd9?\x88\xb9\xc0{u\xa3\xdc?d\x1a\xad\xe8\xf3\x14\xdd?\x9c\x95\x13\x96o?\xe5?\x9cT[\xb8r\xa9\xe5?0\xf1\x01+(\x0f\xdf?W\xbdjqD&\xed?c\xcf1-W\xe6\xe1?\xce\xbc\xe1{zW\xd9?"d\xcf\xd7\x13\x93\xde?\xf2P\xf6\xc3\xd6\x87\xd5?\xc2\x0e\x92q\x89\xda\xd5?\xc0:B\x1bb\x00\x9e?Y\xafHmr\x80\xe3?\x1co\xa7\xba\xa5/\xe4?\xa2\xbc \x9c\xddB\xd0?\xd2L\x935\x17\'\xee?|\x8cM\xeb\x97=\xe8?\x0f0xN*V\xea?\x81p\xe3,!\xf2\xee?\xf5w\xed\x10\x9eu\xe0?\xc5\x16\\LR\xb5\xe1?\xbeh\x04\xa4g\xe5\xd6?\xea\xc0\xb9\xf0\xb2\xd8\xd9?\xac\x9c\xeep\x1a\xa9\xd8?@W9hp\x16\xb1?\xc4\xedS\xd6V\xa1\xed?\x93,!\xdc\xa1\x8b\xe9?\x80)\xb1\xa6[T\xc9?\xac\xbc\x8a\xd21\xdd\xc5?\x80\x9c.g\xf1\xf2\xc6?\tLu\xc3\xf7U\xe9?n\'\x9f?\xbe\xf9\xe9?\xa3\xe7K\x1c\xb3\xa9\xea?X\x98\x1a\xcb\xa0\xcd\xd3? \xb6O\x9c\x1bQ\xc2?"\x89[\xad1\x8e\xea?\xdd\x8f\xa0P\xc7\x0e\xe2?c\xa4j\xa3\r\xac\xef?\xba\xb6\x0f\x8emo\xef?\xe0\xed\xa0\xc5R9\xab?U\xf1\xcd\xcf\xbf\xcb\xea?\x89*#\x06\xb0|\xe8?d\xa3\xad\xcd\xe0]\xcc?\xb5\xe78\xa7w\x13\xe3?\xce\x99\x98\xefS%\xd7?\xb1\xf8\xd8\x8eI\x13\xef?\x91`]\x93\xd4 \xec?\xc0\rPz\xee\xbd\xe7?7\x92\xd4\x0fP\x8f\xe1?L\x0f\xaf\xa9\xc3\x19\xdd?\\}\x15X\x870\xc7? ~ t\xcat\xb1?@?\xec\x97u\x05\xe9?F\x8d:\xac4D\xdb?qY\xe1Qk|\xe2? \xaf\xeaj\xa5\x04\xab?J[\x1al;\x00\xd5?\x00^{n\xc2\xf1S?\xb0\x82dN\xda\xb5\xc7?\xe0 \x07\xe1?R\x92?\xc4\r\x08+\x99J\xe1?I|&U\x19\xc4\xe1?|*\xf9\xebq\x7f\xed?\xbc*\x93\x89k\xab\xe9?oiL\x90;\xe0\xef?\x96\xcd\x9b\xff\x18g\xdc?pt\xb4\xa5\x9c\xa2\xbc?Nu]w*\xb7\xd2?\x88k\xac\xd0\xfd\xbf\xd5?Q\x02$b\xfeH\xea?5\xf6\t\xb6K\x1a\xee?' +p13 +tp14 +b. \ No newline at end of file diff --git a/samples/Pickle/save.p b/samples/Pickle/save.p new file mode 100644 index 00000000..13889c0c --- /dev/null +++ b/samples/Pickle/save.p @@ -0,0 +1,10 @@ +(dp0 +S'lion' +p1 +S'yellow' +p2 +sS'kitty' +p3 +S'red' +p4 +s. \ No newline at end of file From 040af5dad204b01cd312ac0434e90b90bc753e77 Mon Sep 17 00:00:00 2001 From: Ingo Blechschmidt Date: Fri, 25 Sep 2015 19:14:40 +0200 Subject: [PATCH 060/227] Clarify that only nonprimary extensions should be sorted --- lib/linguist/languages.yml | 3 ++- test/test_pedantic.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8409337b..0de559ee 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -8,7 +8,8 @@ # Use "text" if a mode does not exist. # wrap - Boolean wrap to enable line wrapping (default: false) # extensions - An Array of associated extensions (the first one is -# considered the primary extension) +# considered the primary extension, the others should be +# listed alphabetically) # interpreters - An Array of associated interpreters # searchable - Boolean flag to enable searching (defaults to true) # search_term - Deprecated: Some languages maybe indexed under a diff --git a/test/test_pedantic.rb b/test/test_pedantic.rb index 2d0372cc..d34f292e 100644 --- a/test/test_pedantic.rb +++ b/test/test_pedantic.rb @@ -9,7 +9,7 @@ class TestPedantic < Minitest::Test assert_sorted LANGUAGES.keys end - def test_extensions_are_sorted + def test_nonprimary_extensions_are_sorted LANGUAGES.each do |name, language| extensions = language['extensions'] assert_sorted extensions[1..-1].map(&:downcase) if extensions && extensions.size > 1 From 41911d6921d7277c6606b6054dcf12ed5a599cd9 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Fri, 25 Sep 2015 08:26:27 -0700 Subject: [PATCH 061/227] git-linguist: Properly handle $GIT_DIR from git --- bin/git-linguist | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/bin/git-linguist b/bin/git-linguist index 03408ee5..170406de 100755 --- a/bin/git-linguist +++ b/bin/git-linguist @@ -96,24 +96,18 @@ end def git_linguist(args) incremental = true commit = nil - git_dir = nil parser = OptionParser.new do |opts| opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable" opts.on("-f", "--force", "Force a full rescan") { incremental = false } - opts.on("--git-dir=DIR", "Path to the git repository") { |v| git_dir = v } opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v} end parser.parse!(args) - git_dir ||= begin - pwd = Dir.pwd - dotgit = File.join(pwd, ".git") - File.directory?(dotgit) ? dotgit : pwd - end - + git_dir = `git rev-parse --git-dir`.strip + raise "git-linguist must be ran in a Git repository" unless $?.success? wrapper = GitLinguist.new(git_dir, commit, incremental) case args.pop From 41d438b47e8ee83a66705f6c04106662e6ea922f Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Fri, 25 Sep 2015 08:35:34 -0700 Subject: [PATCH 062/227] repository: Do not attempt to scan large repos --- lib/linguist/repository.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/linguist/repository.rb b/lib/linguist/repository.rb index 01e595da..51040734 100644 --- a/lib/linguist/repository.rb +++ b/lib/linguist/repository.rb @@ -126,12 +126,13 @@ module Linguist end protected + MAX_TREE_SIZE = 100_000 def compute_stats(old_commit_oid, cache = nil) + return {} if current_tree.count_recursive(MAX_TREE_SIZE) >= MAX_TREE_SIZE + old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree - read_index - diff = Rugged::Tree.diff(repository, old_tree, current_tree) # Clear file map and fetch full diff if any .gitattributes files are changed From 7c759d4d293412d23de180e5fd54a4192ac4382f Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Mon, 28 Sep 2015 01:45:04 -0700 Subject: [PATCH 063/227] git-linguist: Do not write cache if repo is gone --- bin/git-linguist | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/bin/git-linguist b/bin/git-linguist index 170406de..9541cf82 100755 --- a/bin/git-linguist +++ b/bin/git-linguist @@ -71,17 +71,20 @@ class GitLinguist end def write_cache(object) - tmp_path = Dir::Tmpname.make_tmpname(cache_file, nil) + return unless File.directory? @repo_path - File.open(tmp_path, "wb") do |f| - marshal = Marshal.dump(object) - f.write(Zlib::Deflate.deflate(marshal)) + begin + tmp_path = Dir::Tmpname.make_tmpname(cache_file, nil) + File.open(tmp_path, "wb") do |f| + marshal = Marshal.dump(object) + f.write(Zlib::Deflate.deflate(marshal)) + end + + File.rename(tmp_path, cache_file) + rescue => e + (File.unlink(tmp_path) rescue nil) + raise e end - - File.rename(tmp_path, cache_file) - tmp_path = nil - ensure - (File.unlink(tmp_path) rescue nil) if tmp_path end def load_cache From d8e3bec499a16eefc0f191db463b291d10204c9c Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Fri, 25 Sep 2015 08:36:20 -0700 Subject: [PATCH 064/227] Bump version --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 60bc59e0..3de24f3d 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.6.2" + VERSION = "4.6.3" end From 3426165621a5ff0261b10f70947841117fe82dbf Mon Sep 17 00:00:00 2001 From: wizawu Date: Wed, 30 Sep 2015 13:45:38 +0800 Subject: [PATCH 065/227] Add a TypeScript sample with .tsx extension --- samples/TypeScript/app.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 samples/TypeScript/app.tsx diff --git a/samples/TypeScript/app.tsx b/samples/TypeScript/app.tsx new file mode 100644 index 00000000..43155ceb --- /dev/null +++ b/samples/TypeScript/app.tsx @@ -0,0 +1,9 @@ +import * as React from 'react'; + +export class App extends React.Component { + + render() { + return + + + + + + + + relativeNode + + + + + + + + RelativeTo="Size" + RelativeTo="ParentSize" + RelativeTo="Keyboard" + RelativeTo="PositionChange" + RelativeNode="relativeNode" + + + + + + + + + + + + + + + + + + + diff --git a/samples/XML/MyApp.ux b/samples/XML/MyApp.ux new file mode 100644 index 00000000..0e7b0088 --- /dev/null +++ b/samples/XML/MyApp.ux @@ -0,0 +1,11 @@ + + + + + + + This is an example of EdgeNavigator! + + + + From ab69fd01acfe0a5802a6a4b8d331d0ba6c7caed9 Mon Sep 17 00:00:00 2001 From: Eyal Dechter Date: Mon, 22 Feb 2016 15:03:26 -0500 Subject: [PATCH 217/227] Add .yap ext and yap interpreter for Prolog lang --- lib/linguist/languages.yml | 2 + samples/Prolog/queues.yap | 280 +++++++++++++++++++++++++++++++++++++ 2 files changed, 282 insertions(+) create mode 100644 samples/Prolog/queues.yap diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b497d88b..aae87ce8 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2751,8 +2751,10 @@ Prolog: - .pl - .pro - .prolog + - .yap interpreters: - swipl + - yap tm_scope: source.prolog ace_mode: prolog diff --git a/samples/Prolog/queues.yap b/samples/Prolog/queues.yap new file mode 100644 index 00000000..b464152e --- /dev/null +++ b/samples/Prolog/queues.yap @@ -0,0 +1,280 @@ +% This file has been included as an YAP library by Vitor Santos Costa, 1999 + +% File : QUEUES.PL +% Author : R.A.O'Keefe +% Updated: Friday November 18th, 1983, 8:09:31 pm +% Purpose: define queue operations +% Needs : lib(lists) for append/3. + +/** @defgroup Queues Queues +@ingroup library +@{ + +The following queue manipulation routines are available once +included with the `use_module(library(queues))` command. Queues are +implemented with difference lists. + +*/ + +/** + + @pred make_queue(+ _Queue_) + + +Creates a new empty queue. It should only be used to create a new queue. + + +*/ + + +/** @pred empty_queue(+ _Queue_) + + +Tests whether the queue is empty. + + +*/ +/** @pred head_queue(+ _Queue_, ? _Head_) + + +Unifies Head with the first element of the queue. + + +*/ +/** @pred join_queue(+ _Element_, + _OldQueue_, - _NewQueue_) + + +Adds the new element at the end of the queue. + + +*/ +/** @pred jump_queue(+ _Element_, + _OldQueue_, - _NewQueue_) + + +Adds the new element at the front of the list. + + +*/ +/** @pred length_queue(+ _Queue_, - _Length_) + + +Counts the number of elements currently in the queue. + + +*/ +/** @pred list_join_queue(+ _List_, + _OldQueue_, - _NewQueue_) + + +Ads the new elements at the end of the queue. + + +*/ +/** @pred list_jump_queue(+ _List_, + _OldQueue_, + _NewQueue_) + + +Adds all the elements of _List_ at the front of the queue. + + +*/ +/** @pred list_to_queue(+ _List_, - _Queue_) + + +Creates a new queue with the same elements as _List._ + + +*/ +/** @pred queue_to_list(+ _Queue_, - _List_) + + +Creates a new list with the same elements as _Queue_. + + + + + */ +/** @pred serve_queue(+ _OldQueue_, + _Head_, - _NewQueue_) + + +Removes the first element of the queue for service. + + +*/ +:- module(queues, [ + make_queue/1, % create empty queue + join_queue/3, % add element to end of queue + list_join_queue/3, % add many elements to end of queue + jump_queue/3, % add element to front of queue + list_jump_queue/3, % add many elements to front of queue + head_queue/2, % look at first element of queue + serve_queue/3, % remove first element of queue + length_queue/2, % count elements of queue + empty_queue/1, % test whether queue is empty + list_to_queue/2, % convert list to queue + queue_to_list/2 % convert queue to list + ]). + +:- use_module(library(lists), [append/3]). + +/* +:- mode + make_queue(-), + join_queue(+, +, -), + list_join_queue(+, +, -), + jump_queue(+, +, -), + list_jump_queue(+, +, -), + head_queue(+, ?), + serve_queue(+, ?, -), + length_queue(+, ?), + length_queue(+, +, +, -), + empty_queue(+), + list_to_queue(+, -), + queue_to_list(+, -), + queue_to_list(+, +, -). +*/ + +/* In this package, a queue is represented as a term Front-Back, where + Front is a list and Back is a tail of that list, and is normally a + variable. join_queue will only work when the Back is a variable, + the other routines will accept any tail. The elements of the queue + are the list difference, that is, all the elements starting at Front + and stopping at Back. Examples: + + [a,b,c,d,e|Z]-Z has elements a,b,c,d,e + [a,b,c,d,e]-[d,e] has elements a,b,c + Z-Z has no elements + [1,2,3]-[1,2,3] has no elements +*/ + +% make_queue(Queue) +% creates a new empty queue. It will also match empty queues, but +% because Prolog doesn't do the occurs check, it will also match +% other queues, creating circular lists. So this should ONLY be +% used to make new queues. + +make_queue(X-X). + + + +% join_queue(Element, OldQueue, NewQueue) +% adds the new element at the end of the queue. The old queue is +% side-effected, so you *can't* do +% join_queue(1, OldQ, NewQ1), +% join_queue(2, OldQ, NewQ2). +% There isn't any easy way of doing that, sensible though it might +% be. You *can* do +% join_queue(1, OldQ, MidQ), +% join_queue(2, MidQ, NewQ). +% See list_join_queue. + +join_queue(Element, Front-[Element|Back], Front-Back). + + + +% list_join_queue(List, OldQueue, NewQueue) +% adds the new elements at the end of the queue. The elements are +% added in the same order that they appear in the list, e.g. +% list_join_queue([y,z], [a,b,c|M]-M, [a,b,c,y,z|N]-N). + +list_join_queue(List, Front-OldBack, Front-NewBack) :- + append(List, OldBack, NewBack). + + + +% jump_queue(Element, OldQueue, NewQueue) +% adds the new element at the front of the list. Unlike join_queue, +% jump_queue(1, OldQ, NewQ1), +% jump_queue(2, OldQ, NewQ2) +% *does* work, though if you add things at the end of NewQ1 they +% will also show up in NewQ2. Note that +% jump_queue(1, OldQ, MidQ), +% jump_queue(2, MidQ, NewQ) +% makes NewQ start 2, 1, ... + +jump_queue(Element, Front-Back, [Element|Front]-Back). + + + +% list_jump_queue(List, OldQueue, NewQueue) +% adds all the elements of List at the front of the queue. There are +% two ways we might do this. We could add all the elements one at a +% time, so that they would appear at the beginning of the queue in the +% opposite order to the order they had in the list, or we could add +% them in one lump, so that they have the same order in the queue as +% in the list. As you can easily add the elements one at a time if +% that is what you want, I have chosen the latter. + +list_jump_queue(List, OldFront-Back, NewFront-Back) :- + append(List, OldFront, NewFront). +% reverse(List, OldFront, NewFront). % for the other definition + + + +% head_queue(Queue, Head) +% unifies Head with the first element of the queue. The tricky part +% is that we might be at the end of a queue: Back-Back, with Back a +% variable, and in that case this predicate should not succeed, as we +% don't know what that element is or whether it exists yet. + +head_queue(Front-Back, Head) :- + Front \== Back, % the queue is not empty + Front = [Head|_]. + + + +% serve_queue(OldQueue, Head, NewQueue) +% removes the first element of the queue for service. + +serve_queue(OldFront-Back, Head, NewFront-Back) :- + OldFront \== Back, + OldFront = [Head|NewFront]. + + + +% empty_queue(Queue) +% tests whether the queue is empty. If the back of a queue were +% guaranteed to be a variable, we could have +% empty_queue(Front-Back) :- var(Front). +% but I don't see why you shouldn't be able to treat difference +% lists as queues if you want to. + +empty_queue(Front-Back) :- + Front == Back. + + + +% length_queue(Queue, Length) +% counts the number of elements currently in the queue. Note that +% we have to be careful in checking for the end of the list, we +% can't test for [] the way length(List) does. + +length_queue(Front-Back, Length) :- + length_queue(Front, Back, 0, N), + Length = N. + +length_queue(Front, Back, N, N) :- + Front == Back, !. +length_queue([_|Front], Back, K, N) :- + L is K+1, + length_queue(Front, Back, L, N). + + + +% list_to_queue(List, Queue) +% creates a new queue with the same elements as List. + +list_to_queue(List, Front-Back) :- + append(List, Back, Front). + + + +% queue_to_list(Queue, List) +% creates a new list with the same elements as Queue. + +queue_to_list(Front-Back, List) :- + queue_to_list(Front, Back, List). + +queue_to_list(Front, Back, Ans) :- + Front == Back, !, Ans = []. +queue_to_list([Head|Front], Back, [Head|Tail]) :- + queue_to_list(Front, Back, Tail). + From bfa7eced4469926fe2fe967f32dedb0eeddb03fc Mon Sep 17 00:00:00 2001 From: William Claude Tumeo Date: Fri, 26 Feb 2016 00:31:58 -0300 Subject: [PATCH 218/227] Try fix "Ren'Py being detected as Python" - Remove Ren'Py from Python group - Add .rpy to Python + sample --- lib/linguist/heuristics.rb | 8 ++++++ lib/linguist/languages.yml | 2 +- samples/Python/simpleclient.rpy | 49 +++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 samples/Python/simpleclient.rpy diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 0806ce1f..af6c5e83 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -321,6 +321,14 @@ module Linguist end end + disambiguate ".rpy" do |data| + if /(^(import|from)[\s\S])/m.match(data) + Language["Python"] + else + Language["Ren'Py"] + end + end + disambiguate ".rs" do |data| if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data) Language["Rust"] diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index e9c63ef1..4a348bc2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2831,6 +2831,7 @@ Python: - .pyp - .pyt - .pyw + - .rpy - .tac - .wsgi - .xpy @@ -3004,7 +3005,6 @@ Redcode: Ren'Py: type: programming - group: Python aliases: - renpy color: "#ff7f7f" diff --git a/samples/Python/simpleclient.rpy b/samples/Python/simpleclient.rpy new file mode 100644 index 00000000..ceb5f991 --- /dev/null +++ b/samples/Python/simpleclient.rpy @@ -0,0 +1,49 @@ + +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + + +""" +An example client. Run simpleserv.py first before running this. +""" + +from twisted.internet import reactor, protocol + + +# a client protocol + +class EchoClient(protocol.Protocol): + """Once connected, send a message, then print the result.""" + + def connectionMade(self): + self.transport.write("hello, world!") + + def dataReceived(self, data): + "As soon as any data is received, write it back." + print "Server said:", data + self.transport.loseConnection() + + def connectionLost(self, reason): + print "connection lost" + +class EchoFactory(protocol.ClientFactory): + protocol = EchoClient + + def clientConnectionFailed(self, connector, reason): + print "Connection failed - goodbye!" + reactor.stop() + + def clientConnectionLost(self, connector, reason): + print "Connection lost - goodbye!" + reactor.stop() + + +# this connects the protocol to a server running on port 8000 +def main(): + f = EchoFactory() + reactor.connectTCP("localhost", 8000, f) + reactor.run() + +# this only runs if the module was *not* imported +if __name__ == '__main__': + main() From db994a119767f5f497a7f5fa674729b3d8c9d510 Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Sat, 27 Feb 2016 00:42:03 +0000 Subject: [PATCH 219/227] Remove .txt extension for CSV format --- lib/linguist/languages.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 4fe4390e..4296c4df 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -481,7 +481,6 @@ CSV: tm_scope: none extensions: - .csv - - .txt Cap'n Proto: type: programming From 9bfbd0550c9d8761b434dec3864e13d1bbeb5f85 Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Sat, 27 Feb 2016 14:32:50 +0000 Subject: [PATCH 220/227] Move cars.csv from test/fixtures/Data to samples/CSV --- {test/fixtures/Data => samples/CSV}/cars.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {test/fixtures/Data => samples/CSV}/cars.csv (63%) diff --git a/test/fixtures/Data/cars.csv b/samples/CSV/cars.csv similarity index 63% rename from test/fixtures/Data/cars.csv rename to samples/CSV/cars.csv index 73280e55..3c504cd2 100644 --- a/test/fixtures/Data/cars.csv +++ b/samples/CSV/cars.csv @@ -1,3 +1,3 @@ Year,Make,Model,Length 1997,Ford,E350,2.34 -2000,Mercury,Cougar,2.38 \ No newline at end of file +2000,Mercury,Cougar,2.38 From 3be007526cf43cc0a91504fe86d83af7db3e663a Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Sat, 27 Feb 2016 15:30:22 +0000 Subject: [PATCH 221/227] Fix fixture_blob("Data/cars.csv") Changes `fixture_blob("Data/cars.csv")` to `sample_blob("CSV/cars.csv")` --- test/test_file_blob.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index 08e2e49b..ebb0b7fc 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -152,7 +152,7 @@ class TestBlob < Minitest::Test end def test_csv - assert fixture_blob("Data/cars.csv").csv? + assert sample_blob("CSV/cars.csv").csv? end def test_pdf From 40413dfcc709c847f2d0051c9f694b02d296c096 Mon Sep 17 00:00:00 2001 From: William Tumeo Date: Sat, 27 Feb 2016 23:55:53 -0300 Subject: [PATCH 222/227] Add `class` and `def` to regex --- lib/linguist/heuristics.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index af6c5e83..895bfa20 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -322,7 +322,7 @@ module Linguist end disambiguate ".rpy" do |data| - if /(^(import|from)[\s\S])/m.match(data) + if /(^(import|from|class|def)[\s\S])/m.match(data) Language["Python"] else Language["Ren'Py"] From 6b60e5e786d5bda9b34084c4321ce4637bb57c9d Mon Sep 17 00:00:00 2001 From: William Tumeo Date: Sat, 27 Feb 2016 23:57:46 -0300 Subject: [PATCH 223/227] Remove wrong line in the sample --- samples/Ren'Py/example.rpy | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/samples/Ren'Py/example.rpy b/samples/Ren'Py/example.rpy index 90c3c286..71e34b97 100644 --- a/samples/Ren'Py/example.rpy +++ b/samples/Ren'Py/example.rpy @@ -1421,7 +1421,4 @@ init: # $ renpy.pause(1.0) # hide text with dissolve # -# return - - -Return to the tutorial. +# return \ No newline at end of file From 8fea8a0b47fc547b7a9c4fad10e91aa0da9d1322 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 29 Feb 2016 07:53:48 -0700 Subject: [PATCH 224/227] Grammar update --- vendor/grammars/Sublime-Inform/.gitignore | 2 + .../Inform7/book.sublime-snippet | 6 + .../Inform7/chapter.sublime-snippet | 6 + .../Inform7/door.sublime-snippet | 7 + .../Inform7/inform7.JSON-tmLanguage | 34 ++ .../Sublime-Inform/Inform7/inform7.tmLanguage | 74 +++ .../Inform7/object.sublime-snippet | 8 + .../Inform7/part.sublime-snippet | 6 + .../Inform7/room.sublime-snippet | 7 + .../Inform7/scene.sublime-snippet | 11 + .../Inform7/section.sublime-snippet | 6 + .../Inform7/volume.sublime-snippet | 6 + vendor/grammars/Sublime-Inform/LICENSE.txt | 21 + vendor/grammars/Sublime-Inform/README.md | 8 + .../Commands/Save to CSS.tmCommand | 47 ++ .../Commands/Save to Minified CSS.tmCommand | 47 ++ .../Insert inline Image.tmDragCommand | 38 ++ .../Preferences/Comment.tmPreferences | 36 ++ vendor/grammars/less.tmbundle/README.md | 25 + .../less.tmbundle/Syntaxes/LESS.tmLanguage | 434 ++++++++++++++++++ vendor/grammars/less.tmbundle/info.plist | 26 ++ 21 files changed, 855 insertions(+) create mode 100644 vendor/grammars/Sublime-Inform/.gitignore create mode 100644 vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage create mode 100755 vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage create mode 100644 vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/LICENSE.txt create mode 100644 vendor/grammars/Sublime-Inform/README.md create mode 100644 vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand create mode 100644 vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand create mode 100644 vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand create mode 100644 vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences create mode 100644 vendor/grammars/less.tmbundle/README.md create mode 100644 vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage create mode 100644 vendor/grammars/less.tmbundle/info.plist diff --git a/vendor/grammars/Sublime-Inform/.gitignore b/vendor/grammars/Sublime-Inform/.gitignore new file mode 100644 index 00000000..9bea4330 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/.gitignore @@ -0,0 +1,2 @@ + +.DS_Store diff --git a/vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet new file mode 100644 index 00000000..d00b609b --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet @@ -0,0 +1,6 @@ + + + book + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet new file mode 100644 index 00000000..344ae92d --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet @@ -0,0 +1,6 @@ + + + chapter + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet new file mode 100644 index 00000000..9504585b --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet @@ -0,0 +1,7 @@ + + + door + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage b/vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage new file mode 100644 index 00000000..e5b6e92b --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage @@ -0,0 +1,34 @@ +{ "name": "Inform7", + "scopeName": "source.Inform7", + "fileTypes": ["i7x"], + "patterns": [ + { "name": "keyword.control.Inform7", + "match": "\\b(Include|Release)\\b" + }, + { "name" : "comment.block.Inform7", + "begin" : "\\[", + "end" : "\\]", + "comment" : "All comments in Inform7 are delimited this way." + }, + { "name" : "string.quoted.double.Inform7", + "begin" : "\"", + "end" : "\"", + "patterns": [ + { "name" : "keyword.operator.Inform7", + "begin" : "\\[", + "end" : "\\]", + "comment" : "For logic inside of strings." + } + ] + }, + { "name" : "storage.type.Inform7", + "match" : "(Volume|Book|Chapter|Part|Section|Table)\\s+\\d?\\s+-?\\s+((?:\\w|\\s|-)*)", + "comment": "Matches headings for major sections in Inform7" + }, + { "name": "constant.numeric.Inform7", + "match": "([0-9])+", + "comment":"Gotta call out the numbers!" + } + ], + "uuid": "0c4cbdee-beb7-4ea6-af56-27246d479373" +} \ No newline at end of file diff --git a/vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage b/vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage new file mode 100755 index 00000000..5609885e --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage @@ -0,0 +1,74 @@ + + + + + fileTypes + + i7x + inform + ni + + name + Inform7 + patterns + + + match + \b(Include|Release)\b + name + keyword.control.Inform7 + + + begin + \[ + comment + All comments in Inform7 are delimited this way. + end + \] + name + comment.block.Inform7 + + + begin + " + end + " + name + string.quoted.double.Inform7 + patterns + + + begin + \[ + comment + For logic inside of strings. + end + \] + name + keyword.operator.Inform7 + + + + + comment + Matches headings for major sections in Inform7 + match + (Volume|Book|Chapter|Part|Section|Table)\s+\d?\s+-?\s+((?:\w|\s|-)*) + name + storage.type.Inform7 + + + comment + Gotta call out the numbers! + match + ([0-9])+ + name + constant.numeric.Inform7 + + + scopeName + source.Inform7 + uuid + 0c4cbdee-beb7-4ea6-af56-27246d479373 + + diff --git a/vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet new file mode 100644 index 00000000..65f040af --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet @@ -0,0 +1,8 @@ + + + object + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet new file mode 100644 index 00000000..9e161cca --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet @@ -0,0 +1,6 @@ + + + part + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet new file mode 100644 index 00000000..b6abef45 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet @@ -0,0 +1,7 @@ + + + room + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet new file mode 100644 index 00000000..fd4be030 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet @@ -0,0 +1,11 @@ + + + scene + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet new file mode 100644 index 00000000..7ab043cb --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet @@ -0,0 +1,6 @@ + + + section + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet new file mode 100644 index 00000000..0721fcbf --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet @@ -0,0 +1,6 @@ + + + volume + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/LICENSE.txt b/vendor/grammars/Sublime-Inform/LICENSE.txt new file mode 100644 index 00000000..cda6f052 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Nate Dickson + +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. diff --git a/vendor/grammars/Sublime-Inform/README.md b/vendor/grammars/Sublime-Inform/README.md new file mode 100644 index 00000000..3b907f1e --- /dev/null +++ b/vendor/grammars/Sublime-Inform/README.md @@ -0,0 +1,8 @@ +#Inform7 Package for Sublime Text 2 +This package has a lot of little files that make Inform7 easier to edit in Sublime Text 2. that's why it's called what it is, you see. +##Usage +Grab the zip file, unzip it, and put it in your ```Packages``` Directory. +That's pretty much it. Open an ```i7x``` file in Sublime Text 2 and it'll be all highlighted and there's a bunch of snippets you can use and all that. + +##Want to submit a pull request for this readme file? +Please, please do. \ No newline at end of file diff --git a/vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand b/vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand new file mode 100644 index 00000000..9f8e7561 --- /dev/null +++ b/vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand @@ -0,0 +1,47 @@ + + + + + beforeRunningCommand + saveActiveFile + command + #!/usr/bin/env ruby18 + +file = ENV["TM_FILEPATH"] +target = file.sub(/\.less$/, ".css") +system("lessc \"#{file}\" \"#{target}\"") +puts "Compiled CSS to '#{target}'" + input + document + inputFormat + text + keyEquivalent + @b + name + Save to CSS + outputCaret + afterOutput + outputFormat + text + outputLocation + toolTip + requiredCommands + + + command + lessc + locations + + /opt/local/bin/lessc + /usr/local/bin/lessc + + + + scope + source.css.less + uuid + 78788223-5E5E-434E-98BE-17BCDF600611 + version + 2 + + diff --git a/vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand b/vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand new file mode 100644 index 00000000..fc8fe21f --- /dev/null +++ b/vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand @@ -0,0 +1,47 @@ + + + + + beforeRunningCommand + saveActiveFile + command + #!/usr/bin/env ruby18 + +file = ENV["TM_FILEPATH"] +target = file.sub(/\.less$/, ".css") +system("lessc -x \"#{file}\" \"#{target}\"") +puts "Compiled Minified CSS to '#{target}'" + input + document + inputFormat + text + keyEquivalent + ~@b + name + Save to Minified CSS + outputCaret + afterOutput + outputFormat + text + outputLocation + toolTip + requiredCommands + + + command + lessc + locations + + /opt/local/bin/lessc + /usr/local/bin/lessc + + + + scope + source.css.less + uuid + 448D3A8D-260E-4949-BA33-654886ECDCAF + version + 2 + + diff --git a/vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand b/vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand new file mode 100644 index 00000000..21ce88f4 --- /dev/null +++ b/vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand @@ -0,0 +1,38 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env php +<?php +$path = getenv('TM_DROPPED_FILE'); +$path_parts = pathinfo($path); +$info = getimagesize($path); +list($width, $height) = $info; +$mime = $info['mime']; +$contents = base64_encode(file_get_contents($path)); + +echo "@gfx-{$path_parts['filename']}: \"data:{$mime};base64,{$contents}\";\n"; +echo "@gfx-{$path_parts['filename']}-width: {$width}px;\n"; +echo "@gfx-{$path_parts['filename']}-height: {$height}px;"; + draggedFileExtensions + + png + jpeg + jpg + gif + + input + selection + name + Insert inline Image + output + insertAsSnippet + scope + source.css.less + uuid + 7B0CA307-CC1C-4EE2-9F63-4825800ACDA7 + + diff --git a/vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences b/vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences new file mode 100644 index 00000000..1d8bf1fe --- /dev/null +++ b/vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences @@ -0,0 +1,36 @@ + + + + + name + Comments + scope + source.css.less + settings + + shellVariables + + + name + TM_COMMENT_START + value + // + + + name + TM_COMMENT_START_2 + value + /* + + + name + TM_COMMENT_END_2 + value + */ + + + + uuid + D0CC551B-751D-4A7C-A738-2513E3C7F285 + + diff --git a/vendor/grammars/less.tmbundle/README.md b/vendor/grammars/less.tmbundle/README.md new file mode 100644 index 00000000..ed6ac672 --- /dev/null +++ b/vendor/grammars/less.tmbundle/README.md @@ -0,0 +1,25 @@ +# Installation + +You can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you. + +# License (MIT) + +Copyright (c) 2010 Scott Kyle and Rasmus Andersson + +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. diff --git a/vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage b/vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage new file mode 100644 index 00000000..ac6ff8ba --- /dev/null +++ b/vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage @@ -0,0 +1,434 @@ + + + + + comment + LeSS + fileTypes + + less + + foldingStartMarker + /\*\*(?!\*)|\{\s*($|/\*(?!.*?\*/.*\S)) + foldingStopMarker + (?<!\*)\*\*/|^\s*\} + keyEquivalent + ^~L + name + LESS + patterns + + + match + \b(a|abbr|acronym|address|applet|article|area|audio|video|b|base|big|blockquote|body|br|button|caption|canvas|center|cite|code|col|colgroup|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figure|figcaption|form|frame|frameset|(h[1-6])|head|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|mark|meta|menu|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|q|ruby|s|samp|script|select|small|span|strike|strong|style|sub|sup|summary|svg|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|ul|var|header|section|footer|aside|hgroup|time)\b + name + keyword.control.html.elements + + + begin + " + beginCaptures + + 0 + + name + punctuation.definition.string.begin.css + + + end + " + endCaptures + + 0 + + name + punctuation.definition.string.end.css + + + name + string.quoted.double.css + patterns + + + match + \\. + name + constant.character.escaped.css + + + + + begin + ' + beginCaptures + + 0 + + name + punctuation.definition.string.begin.css + + + end + ' + endCaptures + + 0 + + name + punctuation.definition.string.end.css + + + name + string.quoted.single.css + patterns + + + match + \\. + name + constant.character.escaped.css + + + + + captures + + 1 + + name + entity.other.attribute-name.class.css + + + match + (\.[a-zA-Z0-9_-]+) + + + begin + url\( + contentName + variable.parameter.url + end + \) + name + support.function.any-method.builtin.css + + + match + (#)([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b + name + constant.other.rgb-value.css + + + captures + + 0 + + name + entity.other.attribute-name.id + + + match + #[a-zA-Z0-9_:\(\)-]+ + name + meta.selector.css + + + begin + /\* + beginCaptures + + 0 + + name + punctuation.definition.comment.begin.css + + + end + \*/ + endCaptures + + 0 + + name + punctuation.definition.comment.end.css + + + name + comment.block.css + + + match + (-|\+)?\s*[0-9]+(\.[0-9]+)? + name + constant.numeric.css + + + match + (?<=[\d])(px|pt|cm|mm|in|em|ex|pc)\b|% + name + keyword.other.unit.css + + + captures + + 1 + + name + entity.other.attribute-name.pseudo-element.css + + + match + (:+(after|before|not|last-child|nth-of-type|nth-child|first-child|first-letter|first-line|selection|root)) + + + captures + + 1 + + name + entity.other.attribute-name.pseudo-class.css + + + match + (:+(active|hover|link|visited|focus)) + + + captures + + 1 + + name + punctuation.definition.entity.css + + 2 + + name + entity.other.attribute-name.attribute.css + + 3 + + name + punctuation.separator.operator.css + + 4 + + name + string.unquoted.attribute-value.css + + 5 + + name + string.quoted.double.attribute-value.css + + 6 + + name + punctuation.definition.string.begin.css + + 7 + + name + punctuation.definition.string.end.css + + + match + (?i)(\[)\s*(-?[_a-z\\[[:^ascii:]]][_a-z0-9\-\\[[:^ascii:]]]*)(?:\s*([~|^$*]?=)\s*(?:(-?[_a-z\\[[:^ascii:]]][_a-z0-9\-\\[[:^ascii:]]]*)|((?>(['"])(?:[^\\]|\\.)*?(\6)))))?\s*(\]) + name + meta.attribute-selector.css + + + captures + + 1 + + name + keyword.control.at-rule.import.css + + 2 + + name + punctuation.definition.keyword.css + + + match + ^\s*((@)import\b) + name + meta.at-rule.import.css + + + captures + + 1 + + name + support.type.property-name.css.vendor + + + match + (-(?:webkit|moz|khtml|o|icab|ms)-(?:background-size|border-radius|box-shadow|opacity|border-image))\s*: + + + captures + + 1 + + name + support.type.property-name.css + + + match + \b(azimuth|background-attachment|background-color|background-clip|background-image|background-position|background-repeat|background-size|background|behavior|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border-radius|border|box-shadow|bottom|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|filter|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow(-[xy])?|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|pre-wrap|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|word-wrap|z-index|zoom) + + + match + \b(absolute|all-scroll|always|auto|baseline|below|bidi-override|block|bold|bolder|both|bottom|break-all|break-word|capitalize|center|char|circle|col-resize|collapse|crosshair|dashed|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|groove|hand|help|hidden|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|keep-all|left|lighter|line-edge|line-through|line|linear|list-item|loose|lower-alpha|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|padding-box)\b + name + support.constant.property-value.css + + + match + (\b(?i:arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace)\b) + name + support.constant.font-name.css + + + comment + http://www.w3.org/TR/CSS21/syndata.html#value-def-color + match + \b(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)\b + name + support.constant.color.w3c-standard-color-name.css + + + match + \b(saturate|desaturate|lighten|darken|grayscale)\b + name + support.function.any-method.builtin.less + + + match + \b(rgb|rgba|hsl|hsla|url)\b + name + support.function.any-method.builtin.css + + + captures + + 1 + + name + support.function.any-method.vendor.css + + + match + (-(?:webkit|moz|khtml|o|icab)-(?:gradient|linear-gradient)) + + + match + \b(color-stop|from|to)\b + name + support.function.any-method.webkit.gradient.css + + + captures + + 1 + + name + support.function.less + + + match + (\.[a-zA-Z0-9_-]+)\s*(;|\() + + + begin + (^[ \t]+)?(?=//) + beginCaptures + + 1 + + name + punctuation.whitespace.comment.leading.less + + + end + (?!\G) + patterns + + + begin + // + beginCaptures + + 0 + + name + punctuation.definition.comment.less + + + end + \n + name + comment.line.double-slash.less + + + + + match + @[a-zA-Z0-9_-][\w-]* + name + variable.other.less + + + match + \$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|(?<!\()/=|%=|\+=|\-=|&=|\^=|\/\b + name + keyword.operator.less + + + captures + + 1 + + name + punctuation.section.property-list.begin.css + + 2 + + name + punctuation.section.property-list.end.css + + + comment + Match empty braces to give proper ↩ action + match + (\{)(\}) + name + meta.brace.curly.less + + + match + \{|\} + name + meta.brace.curly.less + + + match + \(|\) + name + meta.brace.round.less + + + match + \[|\] + name + meta.brace.square.less + + + scopeName + source.css.less + uuid + 9343D324-75A1-4733-A5C0-5D1D4B6182D0 + + diff --git a/vendor/grammars/less.tmbundle/info.plist b/vendor/grammars/less.tmbundle/info.plist new file mode 100644 index 00000000..e555f0ba --- /dev/null +++ b/vendor/grammars/less.tmbundle/info.plist @@ -0,0 +1,26 @@ + + + + + contactEmailRot13 + zfurrgf@juvgrsnyyf.bet + contactName + Michael Sheets + description + Extends CSS with dynamic behavior such as variables, mixins, operations and functions. + mainMenu + + items + + 78788223-5E5E-434E-98BE-17BCDF600611 + 448D3A8D-260E-4949-BA33-654886ECDCAF + + submenus + + + name + LESS + uuid + D1D51EE5-E89F-4B14-8AE4-FC364E540B47 + + From 54fab9eb4ed6a3a9bfa36d1c28aaff2aaeea51a8 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 29 Feb 2016 07:55:43 -0700 Subject: [PATCH 225/227] Bumping to v4.7.6 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index bc1707a9..7bb4af7b 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.5" + VERSION = "4.7.6" end From ae27c71d5a9416a0c85f8ca96f0e772355d4133d Mon Sep 17 00:00:00 2001 From: Michael Zhou Date: Mon, 29 Feb 2016 20:35:57 -0500 Subject: [PATCH 226/227] Add BUCK filename to Python in languages.yml BUCK is the filename for the build files of the Facebook Buck build system. BUCK files are valid Python files. Eg.: https://github.com/GerritCodeReview/gerrit/blob/master/BUCK Also add a missing sample for Pants / Bazel BUILD files. They are also valid Python files. --- lib/linguist/languages.yml | 3 ++- samples/Python/filenames/BUCK | 31 +++++++++++++++++++++++ samples/Python/filenames/BUILD | 45 ++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 samples/Python/filenames/BUCK create mode 100644 samples/Python/filenames/BUILD diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 49194cbf..a4f4d3a6 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -474,7 +474,7 @@ CSS: color: "#563d7c" extensions: - .css - + CSV: type: data ace_mode: text @@ -2854,6 +2854,7 @@ Python: - .wsgi - .xpy filenames: + - BUCK - BUILD - SConscript - SConstruct diff --git a/samples/Python/filenames/BUCK b/samples/Python/filenames/BUCK new file mode 100644 index 00000000..9657ff3a --- /dev/null +++ b/samples/Python/filenames/BUCK @@ -0,0 +1,31 @@ +include_defs('//tools/build.defs') + +gerrit_war(name = 'gerrit') +gerrit_war(name = 'gwtgerrit', ui = 'ui_dbg') +gerrit_war(name = 'headless', ui = None) +gerrit_war(name = 'chrome', ui = 'ui_chrome') +gerrit_war(name = 'firefox', ui = 'ui_firefox') +gerrit_war(name = 'safari', ui = 'ui_safari') +gerrit_war(name = 'polygerrit', ui = 'polygerrit') +gerrit_war(name = 'withdocs', docs = True) +gerrit_war(name = 'release', ui = 'ui_optdbg_r', docs = True, context = ['//plugins:core'], visibility = ['//tools/maven:']) + +API_DEPS = [ + '//gerrit-acceptance-framework:acceptance-framework', + '//gerrit-acceptance-framework:acceptance-framework-src', + '//gerrit-acceptance-framework:acceptance-framework-javadoc', + '//gerrit-extension-api:extension-api', + '//gerrit-extension-api:extension-api-src', + '//gerrit-extension-api:extension-api-javadoc', + '//gerrit-plugin-api:plugin-api', + '//gerrit-plugin-api:plugin-api-src', + '//gerrit-plugin-api:plugin-api-javadoc', + '//gerrit-plugin-gwtui:gwtui-api', + '//gerrit-plugin-gwtui:gwtui-api-src', + '//gerrit-plugin-gwtui:gwtui-api-javadoc', +] + +zip_file( + name = 'api', + srcs = API_DEPS, +) diff --git a/samples/Python/filenames/BUILD b/samples/Python/filenames/BUILD new file mode 100644 index 00000000..92057751 --- /dev/null +++ b/samples/Python/filenames/BUILD @@ -0,0 +1,45 @@ +package(default_visibility = ["//scripts/release:__pkg__"]) + +filegroup( + name = "git", + srcs = glob([".git/**"]), +) + +filegroup( + name = "dummy", + visibility = ["//visibility:public"], +) + +filegroup( + name = "srcs", + srcs = glob( + ["**"], + exclude = [ + "bazel-*/**", + "output/**", + ".*/**", + ], + ) + [ + "//examples:srcs", + "//scripts:srcs", + "//site:srcs", + "//src:srcs", + "//tools:srcs", + "//third_party:srcs", + ], + visibility = ["//visibility:private"], +) + +load("//tools/build_defs/pkg:pkg.bzl", "pkg_tar") + +pkg_tar( + name = "bazel-srcs", + files = [":srcs"], + strip_prefix = ".", + # Public but bazel-only visibility. + visibility = ["//:__subpackages__"], +) + +load("//tools/build_rules/go:def.bzl", "go_prefix") + +go_prefix("github.com/bazelbuild/bazel") From ca4ea03828b0444c046e6f5526b147a070a365ea Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 3 Mar 2016 19:15:09 -0500 Subject: [PATCH 227/227] Recognizing Jenkinsfile as Groovy source. --- lib/linguist/languages.yml | 2 ++ lib/linguist/vendor.yml | 3 ++ samples/Groovy/filenames/Jenkinsfile | 46 ++++++++++++++++++++++++++++ test/test_file_blob.rb | 3 ++ 4 files changed, 54 insertions(+) create mode 100644 samples/Groovy/filenames/Jenkinsfile diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 49194cbf..117f2f79 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1310,6 +1310,8 @@ Groovy: - .gvy interpreters: - groovy + filenames: + - Jenkinsfile Groovy Server Pages: type: programming diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index 294f312b..15001e98 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -302,3 +302,6 @@ # Android Google APIs - (^|/)\.google_apis/ + +# Jenkins Pipeline +- ^Jenkinsfile$ diff --git a/samples/Groovy/filenames/Jenkinsfile b/samples/Groovy/filenames/Jenkinsfile new file mode 100644 index 00000000..582306c4 --- /dev/null +++ b/samples/Groovy/filenames/Jenkinsfile @@ -0,0 +1,46 @@ +jettyUrl = 'http://localhost:8081/' + +def servers + +stage 'Dev' +node { + checkout scm + servers = load 'servers.groovy' + mvn '-o clean package' + dir('target') {stash name: 'war', includes: 'x.war'} +} + +stage 'QA' +parallel(longerTests: { + runTests(servers, 30) +}, quickerTests: { + runTests(servers, 20) +}) + +stage name: 'Staging', concurrency: 1 +node { + servers.deploy 'staging' +} + +input message: "Does ${jettyUrl}staging/ look good?" + +stage name: 'Production', concurrency: 1 +node { + sh "wget -O - -S ${jettyUrl}staging/" + echo 'Production server looks to be alive' + servers.deploy 'production' + echo "Deployed to ${jettyUrl}production/" +} + +def mvn(args) { + sh "${tool 'Maven 3.x'}/bin/mvn ${args}" +} + +def runTests(servers, duration) { + node { + checkout scm + servers.runWithServer {id -> + mvn "-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}" + } + } +} diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index ebb0b7fc..1b83a0fb 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -522,6 +522,9 @@ class TestBlob < Minitest::Test assert sample_blob("myapp/My Template.xctemplate/___FILEBASENAME___.h").vendored? assert sample_blob("myapp/My Images.xcassets/some/stuff.imageset/Contents.json").vendored? assert !sample_blob("myapp/MyData.json").vendored? + + # Jenkins + assert sample_blob("Jenkinsfile").vendored? end def test_documentation