From 7f5bb25542db166cc8b9232fe0cf18484efd709f Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Thu, 13 Aug 2015 16:56:21 +0200 Subject: [PATCH 01/44] Remove grammar for Prolog from TextMate bundle --- .gitmodules | 3 --- grammars.yml | 2 -- vendor/grammars/prolog.tmbundle | 1 - 3 files changed, 6 deletions(-) delete mode 160000 vendor/grammars/prolog.tmbundle diff --git a/.gitmodules b/.gitmodules index f4238e8b..aff647b7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -397,9 +397,6 @@ [submodule "vendor/grammars/processing.tmbundle"] path = vendor/grammars/processing.tmbundle url = https://github.com/textmate/processing.tmbundle -[submodule "vendor/grammars/prolog.tmbundle"] - path = vendor/grammars/prolog.tmbundle - url = https://github.com/textmate/prolog.tmbundle [submodule "vendor/grammars/python-django.tmbundle"] path = vendor/grammars/python-django.tmbundle url = https://github.com/textmate/python-django.tmbundle diff --git a/grammars.yml b/grammars.yml index 4da6c0e2..33880871 100644 --- a/grammars.yml +++ b/grammars.yml @@ -431,8 +431,6 @@ vendor/grammars/powershell: - source.powershell vendor/grammars/processing.tmbundle: - source.processing -vendor/grammars/prolog.tmbundle: -- source.prolog vendor/grammars/protobuf-tmbundle: - source.protobuf vendor/grammars/puppet-textmate-bundle: diff --git a/vendor/grammars/prolog.tmbundle b/vendor/grammars/prolog.tmbundle deleted file mode 160000 index d955aca3..00000000 --- a/vendor/grammars/prolog.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d955aca38b7aadce76e6815eb09487a370206742 From 8d216f0c43a21e6f5d3d4ac1a45aec40fc19b959 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Thu, 13 Aug 2015 17:15:04 +0200 Subject: [PATCH 02/44] Grammar for Prolog from Sublime Text package MPLv2 License is currently unrecognized --- .gitmodules | 3 +++ grammars.yml | 3 +++ lib/linguist/languages.yml | 1 + vendor/grammars/sublimeprolog | 1 + 4 files changed, 8 insertions(+) create mode 160000 vendor/grammars/sublimeprolog diff --git a/.gitmodules b/.gitmodules index aff647b7..566254e5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -668,3 +668,6 @@ [submodule "vendor/grammars/st2-zonefile"] path = vendor/grammars/st2-zonefile url = https://github.com/sixty4k/st2-zonefile +[submodule "vendor/grammars/sublimeprolog"] + path = vendor/grammars/sublimeprolog + url = https://github.com/alnkpa/sublimeprolog diff --git a/grammars.yml b/grammars.yml index 33880871..0de7915f 100644 --- a/grammars.yml +++ b/grammars.yml @@ -529,6 +529,9 @@ vendor/grammars/sublime_cobol: vendor/grammars/sublime_man_page_support: - source.man - text.groff +vendor/grammars/sublimeprolog/: +- source.prolog +- source.prolog.eclipse vendor/grammars/sublimetext-cuda-cpp: - source.cuda-c++ vendor/grammars/swift.tmbundle: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 3ff88a03..54b8ab65 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2632,6 +2632,7 @@ Prolog: - .prolog interpreters: - swipl + tm_scope: source.prolog ace_mode: prolog Propeller Spin: diff --git a/vendor/grammars/sublimeprolog b/vendor/grammars/sublimeprolog new file mode 160000 index 00000000..465efc54 --- /dev/null +++ b/vendor/grammars/sublimeprolog @@ -0,0 +1 @@ +Subproject commit 465efc540e0e87787226a8563d65b15959e5a065 From 6226a46988523123e3ec2437a4ae668b7820a202 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Thu, 13 Aug 2015 17:35:01 +0200 Subject: [PATCH 03/44] Recognize the Mozilla Public License for grammars --- test/test_grammars.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/test_grammars.rb b/test/test_grammars.rb index 88624ae8..dc64c6e6 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -132,6 +132,12 @@ class TestGrammars < Minitest::Test "BSD" elsif content.include?("Permission is hereby granted") || content =~ /\bMIT\b/ "MIT" + elsif content.include?("Mozilla Public License") + if content.include?("version 2.0") + "MPLv2.0" + elsif content.include?("version 1.1") + "MPLv1.1" + end elsif content.include?("unlicense.org") "unlicense" elsif content.include?("http://www.wtfpl.net/txt/copying/") From fd9ce2d1cf1e738058be7f39505431a55a4ed9e6 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Wed, 19 Aug 2015 12:54:21 -0400 Subject: [PATCH 04/44] use licensee to classify submodule licenses --- github-linguist.gemspec | 2 + test/helper.rb | 1 + test/test_grammars.rb | 126 ++++++++++++++++++++++++++-------------- 3 files changed, 84 insertions(+), 45 deletions(-) diff --git a/github-linguist.gemspec b/github-linguist.gemspec index ce2303bf..548812a3 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -24,4 +24,6 @@ Gem::Specification.new do |s| s.add_development_dependency 'rake' s.add_development_dependency 'yajl-ruby' s.add_development_dependency 'color-proximity', '~> 0.2.1' + s.add_development_dependency 'licensee', '~> 4.7.3' + end diff --git a/test/helper.rb b/test/helper.rb index ab3cc8fa..80060c29 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -3,6 +3,7 @@ require "minitest/autorun" require "mocha/setup" require "linguist" require 'color-proximity' +require 'licensee' def fixtures_path File.expand_path("../fixtures", __FILE__) diff --git a/test/test_grammars.rb b/test/test_grammars.rb index 88624ae8..a510585c 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -3,12 +3,13 @@ require_relative "./helper" class TestGrammars < Minitest::Test ROOT = File.expand_path("../..", __FILE__) - LICENSE_WHITELIST = [ + PROJECT_WHITELIST = [ # This grammar's MIT license is inside a subdirectory. "vendor/grammars/SublimePapyrus", # This grammar has a nonstandard but acceptable license. "vendor/grammars/gap-tmbundle", + "vendor/grammars/factor", # These grammars have no license but have been grandfathered in. New grammars # must have a license that allows redistribution. @@ -16,6 +17,22 @@ class TestGrammars < Minitest::Test "vendor/grammars/x86-assembly-textmate-bundle" ].freeze + # List of allowed SPDX license names + LICENSE_WHITELIST = %w[ + apache-2.0 + bsd-2-clause + bsd-3-clause + cc-by-sa-3.0 + gpl-2.0 + gpl-3.0 + lgpl-3.0 + mit + textmate + unlicense + wtfpl + zlib + ].freeze + def setup @grammars = YAML.load(File.read(File.join(ROOT, "grammars.yml"))) end @@ -63,47 +80,35 @@ class TestGrammars < Minitest::Test end def test_submodules_have_licenses - categories = submodule_paths.group_by do |submodule| - files = Dir[File.join(ROOT, submodule, "*")] - license = files.find { |path| File.basename(path) =~ /\b(un)?licen[cs]e\b/i } || files.find { |path| File.basename(path) =~ /\bcopying\b/i } - if license.nil? - if readme = files.find { |path| File.basename(path) =~ /\Areadme\b/i } - license = readme if File.read(readme) =~ /\blicen[cs]e\b/i - end - end - if license.nil? - :unlicensed - elsif classify_license(license) - :licensed + submodule_licenses.each do |submodule, license| + next if PROJECT_WHITELIST.include?(submodule) + + license_file = Licensee::Project.new(submodule).license_file + submodule_name = submodule.split("/").last + + if license_file + assert license, "Submodule #{submodule_name} contains an unrecognized license. Please update #{__FILE__} to recognize the license" else - :unrecognized + assert license, "Submodule #{submodule_name} is unlicensed. All grammars must have a license that permits redistribution" end + + assert LICENSE_WHITELIST.include?(license), "Submodule #{submodule_name} is licensed under the #{license} license" end - unlicensed = categories[:unlicensed] || [] - unrecognized = categories[:unrecognized] || [] - disallowed_unlicensed = unlicensed - LICENSE_WHITELIST - disallowed_unrecognized = unrecognized - LICENSE_WHITELIST - extra_whitelist_entries = LICENSE_WHITELIST - (unlicensed | unrecognized) + unlicensed = submodule_licenses.select { |k,v| v.nil? } + unrecognized = submodule_licenses.select { |k,v| v.nil? && Licensee::Project.new(k).license_file} + licensed = submodule_licenses.reject { |k,v| v.nil? } + unapproved = licensed.reject { |k,v| LICENSE_WHITELIST.include?(v) } + extra_whitelist_entries = PROJECT_WHITELIST - unlicensed.keys - unrecognized.keys + assert unapproved.empty? - message = "" - if disallowed_unlicensed.any? - message << "The following grammar submodules don't seem to have a license. All grammars must have a license that permits redistribution.\n" - message << disallowed_unlicensed.sort.join("\n") - end - if disallowed_unrecognized.any? - message << "\n\n" unless message.empty? - message << "The following grammar submodules have an unrecognized license. Please update #{__FILE__} to recognize the license.\n" - message << disallowed_unrecognized.sort.join("\n") - end - if extra_whitelist_entries.any? - message << "\n\n" unless message.empty? - message << "The following grammar submodules are listed in LICENSE_WHITELIST but either have a license (yay!)\n" - message << "or have been removed from the repository. Please remove them from the whitelist.\n" - message << extra_whitelist_entries.sort.join("\n") - end + extra_whitelist_entries.each do |submodule| + license = submodule_licenses[submodule] + submodule_name = submodule.split("/").last - assert disallowed_unlicensed.empty? && disallowed_unrecognized.empty? && extra_whitelist_entries.empty?, message + assert_equal nil, license, "Submodule #{submodule_name} is listed in PROJECT_WHITELIST but has a license" + assert Dir.exists?(submodule), "Submodule #{submodule_name} is listed in PROJECT_WHITELIST but doesn't appear to be part of the project" + end end private @@ -112,30 +117,61 @@ class TestGrammars < Minitest::Test @submodule_paths ||= `git config --list --file "#{File.join(ROOT, ".gitmodules")}"`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last } end + # Returns a hash of submodules in the form of submodule_path => license + def submodule_licenses + @submodule_licenses = begin + submodules = {} + submodule_paths.each { |submodule| submodules[submodule] = submodule_license(submodule) } + submodules + end + end + + # Given the path to a submodule, return its SPDX-compliant license key + def submodule_license(submodule) + # Prefer Licensee to detect a submodule's license + project = Licensee::Project.new(submodule) + return project.license.key if project.license + + # We know a license file exists, but Licensee wasn't able to detect the license, + # Let's try our own more permissive regex method + if project.license_file + path = File.expand_path project.license_file.path, submodule + license = classify_license(path) + return license if license + end + + # Neither Licensee nor our own regex was able to detect the license, lets check the readme + files = Dir[File.join(ROOT, submodule, "*")] + if readme = files.find { |path| File.basename(path) =~ /\Areadme\b/i } + classify_license(readme) + end + end + def classify_license(path) content = File.read(path) + return unless content =~ /\blicen[cs]e\b/i if content.include?("Apache License") && content.include?("2.0") - "Apache 2.0" + "apache-2.0" elsif content.include?("GNU") && content =~ /general/i && content =~ /public/i if content =~ /version 2/i - "GPLv2" + "gpl-2.0" elsif content =~ /version 3/i - "GPLv3" + "gpl-3.0" end elsif content.include?("GPL") && content.include?("http://www.gnu.org/licenses/gpl.html") - "GPLv3" - elsif content.include?("Creative Commons") - "CC" + "gpl-3.0" + elsif content.include?("Creative Commons Attribution-Share Alike 3.0") + "cc-by-sa-3.0" elsif content.include?("tidy-license.txt") || content.include?("If not otherwise specified (see below)") "textmate" elsif content =~ /^\s*[*-]\s+Redistribution/ || content.include?("Redistributions of source code") - "BSD" + "bsd" elsif content.include?("Permission is hereby granted") || content =~ /\bMIT\b/ - "MIT" + "mit" elsif content.include?("unlicense.org") "unlicense" elsif content.include?("http://www.wtfpl.net/txt/copying/") - "WTFPL" + "wtfpl" elsif content.include?("zlib") && content.include?("license") && content.include?("2. Altered source versions must be plainly marked as such") "zlib" end From 8a7ceaa84530cc9522a4b6d597522a95574fced0 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Wed, 19 Aug 2015 13:22:31 -0400 Subject: [PATCH 05/44] bump licensee to support ruby 1.9.3 --- github-linguist.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github-linguist.gemspec b/github-linguist.gemspec index 548812a3..87bbc8bf 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -24,6 +24,6 @@ Gem::Specification.new do |s| s.add_development_dependency 'rake' s.add_development_dependency 'yajl-ruby' s.add_development_dependency 'color-proximity', '~> 0.2.1' - s.add_development_dependency 'licensee', '~> 4.7.3' + s.add_development_dependency 'licensee', '~> 4.7.4' end From 0d7a264981d1bf43a7d13c7e577fd418f1d27aa7 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 20:43:16 +0200 Subject: [PATCH 06/44] Update submodule for Prolog grammar --- vendor/grammars/sublimeprolog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/sublimeprolog b/vendor/grammars/sublimeprolog index 465efc54..9fd46df4 160000 --- a/vendor/grammars/sublimeprolog +++ b/vendor/grammars/sublimeprolog @@ -1 +1 @@ -Subproject commit 465efc540e0e87787226a8563d65b15959e5a065 +Subproject commit 9fd46df4b63479a8672d184cd47374a044a11b11 From 7d91e4959a5efeaedfce4ad9b0c4a42c867327a9 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 20:56:14 +0200 Subject: [PATCH 07/44] Dissociate ECLiPSe from Prolog ECLiPSe syntax is slightly different from Prolog syntax ECLiPSe is in the Prolog group so it will only be highlighted differently --- lib/linguist/heuristics.rb | 2 +- lib/linguist/languages.yml | 9 ++++++++- samples/{Prolog => ECLiPSe}/or-constraint.ecl | 0 test/test_heuristics.rb | 6 +++--- 4 files changed, 12 insertions(+), 5 deletions(-) rename samples/{Prolog => ECLiPSe}/or-constraint.ecl (100%) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index fc8699c5..12104ee6 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -112,7 +112,7 @@ module Linguist disambiguate ".ecl" do |data| if /^[^#]+:-/.match(data) - Language["Prolog"] + Language["ECLiPSe"] elsif data.include?(":=") Language["ECL"] end diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6ff194c9..fe37aacb 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -843,6 +843,14 @@ ECL: tm_scope: none ace_mode: text +ECLiPSe: + type: programming + group: prolog + extensions: + - .ecl + tm_scope: source.prolog.eclipse + ace_mode: prolog + Eagle: type: markup color: "#814C05" @@ -2628,7 +2636,6 @@ Prolog: color: "#74283c" extensions: - .pl - - .ecl - .pro - .prolog interpreters: diff --git a/samples/Prolog/or-constraint.ecl b/samples/ECLiPSe/or-constraint.ecl similarity index 100% rename from samples/Prolog/or-constraint.ecl rename to samples/ECLiPSe/or-constraint.ecl diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 59041e7b..3448235b 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -66,11 +66,11 @@ class TestHeuristcs < Minitest::Test }) end - # Candidate languages = ["ECL", "Prolog"] - def test_ecl_prolog_by_heuristics + # Candidate languages = ["ECL", "ECLiPSe"] + def test_ecl_by_heuristics assert_heuristics({ "ECL" => all_fixtures("ECL", "*.ecl"), - "Prolog" => all_fixtures("Prolog", "*.ecl") + "ECLiPSe" => all_fixtures("ECLiPSe", "*.ecl") }) end From 5c2cfbc334a0a5efc3896cd69dc81e858308df75 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 21:27:40 +0200 Subject: [PATCH 08/44] Remove Typescript grammar --- .gitmodules | 3 --- grammars.yml | 2 -- vendor/grammars/sublime-better-typescript | 1 - 3 files changed, 6 deletions(-) delete mode 160000 vendor/grammars/sublime-better-typescript diff --git a/.gitmodules b/.gitmodules index 47cf934f..dea29f0b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -169,9 +169,6 @@ [submodule "vendor/grammars/sublime-idris"] path = vendor/grammars/sublime-idris url = https://github.com/laughedelic/sublime-idris -[submodule "vendor/grammars/sublime-better-typescript"] - path = vendor/grammars/sublime-better-typescript - url = https://github.com/lavrton/sublime-better-typescript [submodule "vendor/grammars/moonscript-tmbundle"] path = vendor/grammars/moonscript-tmbundle url = https://github.com/leafo/moonscript-tmbundle diff --git a/grammars.yml b/grammars.yml index 88d21d39..4230142b 100644 --- a/grammars.yml +++ b/grammars.yml @@ -484,8 +484,6 @@ vendor/grammars/sublime-aspectj/: - source.aspectj vendor/grammars/sublime-befunge: - source.befunge -vendor/grammars/sublime-better-typescript: -- source.ts vendor/grammars/sublime-bsv: - source.bsv vendor/grammars/sublime-cirru: diff --git a/vendor/grammars/sublime-better-typescript b/vendor/grammars/sublime-better-typescript deleted file mode 160000 index 8266c06a..00000000 --- a/vendor/grammars/sublime-better-typescript +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8266c06aabe5e473766bd9bb62dfeb106fe296a2 From 519b169df0cafc8fcb14bb6b1d9dcab4b2bff51b Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 21:30:24 +0200 Subject: [PATCH 09/44] New grammar for Typescript from Sublime Text package --- .gitmodules | 3 +++ grammars.yml | 3 +++ vendor/grammars/sublime-typescript | 1 + 3 files changed, 7 insertions(+) create mode 160000 vendor/grammars/sublime-typescript diff --git a/.gitmodules b/.gitmodules index dea29f0b..429acb57 100644 --- a/.gitmodules +++ b/.gitmodules @@ -671,3 +671,6 @@ [submodule "vendor/grammars/sublime-aspectj"] path = vendor/grammars/sublime-aspectj url = https://github.com/pchaigno/sublime-aspectj +[submodule "vendor/grammars/sublime-typescript"] + path = vendor/grammars/sublime-typescript + url = https://github.com/Microsoft/TypeScript-Sublime-Plugin diff --git a/grammars.yml b/grammars.yml index 4230142b..df137f86 100644 --- a/grammars.yml +++ b/grammars.yml @@ -522,6 +522,9 @@ vendor/grammars/sublime-text-ox/: - source.ox vendor/grammars/sublime-text-pig-latin/: - source.pig_latin +vendor/grammars/sublime-typescript/: +- source.ts +- source.tsx vendor/grammars/sublime-varnish: - source.varnish.vcl vendor/grammars/sublime_cobol: diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript new file mode 160000 index 00000000..0d519e5a --- /dev/null +++ b/vendor/grammars/sublime-typescript @@ -0,0 +1 @@ +Subproject commit 0d519e5a5592bd4152523fe359d1a0ebbe9cc493 From 80e2d112b22281a965f31ec162e2a4d1c5c728ca Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 22:07:23 +0200 Subject: [PATCH 10/44] tm_scope for RMarkdown --- 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 ef3b0968..6308fb34 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2813,7 +2813,7 @@ RMarkdown: ace_mode: markdown extensions: - .rmd - tm_scope: none + tm_scope: source.gfm Racket: type: programming From e214a52de5aed5baf2f6580d35a8a1641797e007 Mon Sep 17 00:00:00 2001 From: Alejandro Oviedo Date: Wed, 19 Aug 2015 19:15:05 -0300 Subject: [PATCH 11/44] relativize link in readme ...so it could link properly in other branches and forks. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 374851fb..4ca08af1 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md 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: 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](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them. +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. 0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you an add, especially links to public repositories, is helpful. 0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified. From a74f3b3e460f42549a48b529d4c2657779fc15d0 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 20 Aug 2015 10:16:52 +0100 Subject: [PATCH 12/44] Adding Perl/Perl6 heuristic for '.t' --- lib/linguist/heuristics.rb | 4 ++-- test/test_heuristics.rb | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 12104ee6..7c523fa8 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -33,7 +33,7 @@ module Linguist # # Examples # - # disambiguate "Perl", "Prolog" do |data| + # disambiguate ".pm" do |data| # if data.include?("use strict") # Language["Perl"] # elsif /^[^#]+:-/.match(data) @@ -102,7 +102,7 @@ module Linguist end end - disambiguate ".pm" do |data| + disambiguate ".pm", ".t" do |data| if /^(use v6|(my )?class|module)/.match(data) Language["Perl6"] elsif /use strict|use\s+v?5\./.match(data) diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 3448235b..cca48675 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -66,6 +66,16 @@ 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({ From fbb3ab22920e2ffb305aa3e1806e8348b950e76b Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 20 Aug 2015 11:38:31 -0400 Subject: [PATCH 13/44] batch license test output --- test/test_grammars.rb | 52 ++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/test/test_grammars.rb b/test/test_grammars.rb index a510585c..12b22bd6 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -79,36 +79,32 @@ class TestGrammars < Minitest::Test end end + 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* ")}" + end + def test_submodules_have_licenses - submodule_licenses.each do |submodule, license| - next if PROJECT_WHITELIST.include?(submodule) + 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* ")}" + end - license_file = Licensee::Project.new(submodule).license_file - submodule_name = submodule.split("/").last + 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* ")}" + end - if license_file - assert license, "Submodule #{submodule_name} contains an unrecognized license. Please update #{__FILE__} to recognize the license" - else - assert license, "Submodule #{submodule_name} is unlicensed. All grammars must have a license that permits redistribution" - end + def test_submodules_whitelist_has_no_extra_entries + extra_whitelist_entries = PROJECT_WHITELIST - submodule_licenses.select { |k,v| v.nil? }.keys + not_present = extra_whitelist_entries.reject { |k,v| Dir.exists?(k) } + licensed = extra_whitelist_entries.select { |k,v| submodule_licenses[k] } - assert LICENSE_WHITELIST.include?(license), "Submodule #{submodule_name} is licensed under the #{license} license" - end + msg = "The following whitelisted submodules don't appear to be part of the project:\n* #{not_present.join("\n* ")}" + assert_equal [], not_present, msg - unlicensed = submodule_licenses.select { |k,v| v.nil? } - unrecognized = submodule_licenses.select { |k,v| v.nil? && Licensee::Project.new(k).license_file} - licensed = submodule_licenses.reject { |k,v| v.nil? } - unapproved = licensed.reject { |k,v| LICENSE_WHITELIST.include?(v) } - extra_whitelist_entries = PROJECT_WHITELIST - unlicensed.keys - unrecognized.keys - assert unapproved.empty? - - extra_whitelist_entries.each do |submodule| - license = submodule_licenses[submodule] - submodule_name = submodule.split("/").last - - assert_equal nil, license, "Submodule #{submodule_name} is listed in PROJECT_WHITELIST but has a license" - assert Dir.exists?(submodule), "Submodule #{submodule_name} is listed in PROJECT_WHITELIST but doesn't appear to be part of the project" - end + msg = "The following whitelisted submodules actually have licenses and don't need to be whitelisted:\n* #{licensed.join("\n* ")}" + assert_equal [], licensed, msg end private @@ -119,7 +115,7 @@ class TestGrammars < Minitest::Test # Returns a hash of submodules in the form of submodule_path => license def submodule_licenses - @submodule_licenses = begin + @@submodule_licenses ||= begin submodules = {} submodule_paths.each { |submodule| submodules[submodule] = submodule_license(submodule) } submodules @@ -164,12 +160,8 @@ class TestGrammars < Minitest::Test "cc-by-sa-3.0" elsif content.include?("tidy-license.txt") || content.include?("If not otherwise specified (see below)") "textmate" - elsif content =~ /^\s*[*-]\s+Redistribution/ || content.include?("Redistributions of source code") - "bsd" elsif content.include?("Permission is hereby granted") || content =~ /\bMIT\b/ "mit" - elsif content.include?("unlicense.org") - "unlicense" elsif content.include?("http://www.wtfpl.net/txt/copying/") "wtfpl" elsif content.include?("zlib") && content.include?("license") && content.include?("2. Altered source versions must be plainly marked as such") From 62a0faa729593936cfd80b3996284f12da71dbf5 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 20 Aug 2015 12:23:52 -0400 Subject: [PATCH 14/44] let us --- test/test_grammars.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_grammars.rb b/test/test_grammars.rb index 12b22bd6..6aab2935 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -136,7 +136,7 @@ class TestGrammars < Minitest::Test return license if license end - # Neither Licensee nor our own regex was able to detect the license, lets check the readme + # Neither Licensee nor our own regex was able to detect the license, let's check the readme files = Dir[File.join(ROOT, submodule, "*")] if readme = files.find { |path| File.basename(path) =~ /\Areadme\b/i } classify_license(readme) From 16e65fe18953a0231ff6721939ded1a8e4677245 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Thu, 20 Aug 2015 10:07:44 -0700 Subject: [PATCH 15/44] Make RAML a markup language RAML was originally merged as a data language, but this seems like an incorrect definition. I changed it to be markup instead, which will also result in RAML appearing in repo statistics. --- 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 8936b0f4..5b31ed4f 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2778,7 +2778,7 @@ R: ace_mode: r RAML: - type: data + type: markup ace_mode: yaml tm_scope: source.yaml color: "#77d9fb" From cb550a36623b0516262701b9cb7c4e2c1e5756aa Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 20 Aug 2015 15:30:51 -0400 Subject: [PATCH 16/44] remove some random submodules --- vendor/grammars/prolog.tmbundle | 1 - vendor/grammars/sublime-better-typescript | 1 - 2 files changed, 2 deletions(-) delete mode 160000 vendor/grammars/prolog.tmbundle delete mode 160000 vendor/grammars/sublime-better-typescript diff --git a/vendor/grammars/prolog.tmbundle b/vendor/grammars/prolog.tmbundle deleted file mode 160000 index d955aca3..00000000 --- a/vendor/grammars/prolog.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d955aca38b7aadce76e6815eb09487a370206742 diff --git a/vendor/grammars/sublime-better-typescript b/vendor/grammars/sublime-better-typescript deleted file mode 160000 index 8266c06a..00000000 --- a/vendor/grammars/sublime-better-typescript +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8266c06aabe5e473766bd9bb62dfeb106fe296a2 From 96518d2d0f5bdfb01f6a0598193876d4bf942fad Mon Sep 17 00:00:00 2001 From: LeonaMorro Date: Fri, 21 Aug 2015 11:17:12 +0200 Subject: [PATCH 17/44] 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 18/44] 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 19/44] 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 20/44] 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 21/44] 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 22/44] 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 23/44] 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 24/44] 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 25/44] 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 26/44] 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 27/44] 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 28/44] 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 29/44] 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 30/44] 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 31/44] 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 dd8eaf2893030d808fdf10553f79ac75ae5f596c Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sun, 30 Aug 2015 12:32:33 +0200 Subject: [PATCH 32/44] 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 33/44] 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 34/44] 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 35/44] 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 36/44] 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 37/44] 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 38/44] 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 39/44] 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 40/44] 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 41/44] 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 114a331106d8da31041657345277a160bc8f99c4 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Wed, 2 Sep 2015 07:04:51 +1000 Subject: [PATCH 42/44] 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 e4ce5bfe39bb7b29d416db16241b33acb5df7e2a Mon Sep 17 00:00:00 2001 From: Scott Nelson Date: Wed, 2 Sep 2015 12:52:25 -0400 Subject: [PATCH 43/44] 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 44/44] 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